2014-02-13 31 views
1

我在Kali 32位(基于Debian)。我禁用ASLR,NX和堆栈金丝雀。这不是一个连续的ret2ret漏洞,因为我使用主返回语句跳转到shellcode所在的缓冲区。这里是我的代码:在ret2ret漏洞上执行shellcode

void foo(char *args) 
{ 
    char buffer[512]; 
    strcpy(buffer, args); 
} 

int main (int argc, char *argv[]) 
{ 
    if(argc > 1) 
     foo(argv[1]); 
    else 
     printf("no input args\n"); 
    printf("no good\n"); 
    return 0; 
} 

void exploit() 
{ 
    printf("bravo !!!\n"); 
    exit(0); 
} 

我对EBP溢出实际发生在520偏移它覆盖EBP的用0x00最低显著字节。

我的第一个测试是试图跳到exploit(),所以我用516 NOP和最后4个字节的漏洞地址填充了我的缓冲区。它的工作,但这是我的第一个问题: 当ret语句在main中执行时,我们跳到缓冲区的某处,在那里执行NOP。为什么当我到达exploit的地址时,即使在我的缓冲区中,我也没有用于跳转的asm指令,它会自动跳转?

我的第二个问题是:当我想这一次出口到执行的shellcode(0)指令:python -c 'print "\x90"*514+"\x31\xdb\xb0\x01\xcd\x80"' 为什么我得到这个代替的,什么是错误的含义:

Program received signal SIGSEGV, Segmentation fault. 
_IO_new_file_write (f=0xb7ff59b0, data=0x0, n=-1209570250) at fileops.c:1286 
1286 fileops.c: Aucun fichier ou dossier de ce type. 

回答

0

你正试图把退出(0)的shellcode放在保存的返回地址中?如果你试图执行exit(0),你需要'exit'调用的地址,并推送0以外的参数作为参数:)

+0

不,我不想调用libc exit ()函数,但我想执行系统调用退出的程序集中断。这里的参数传递给寄存器。我使用exit(0)shellcode,因为它很短并且易于测试。而且我正在溢出%ebp,所以当主函数返回%eip时会指向缓冲区的某处,这就是为什么我使用了0x90 NOP的原因。 – user3102158