在ret2ret漏洞上执行shellcode
问题描述:
我在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)的shellcode放在保存的返回地址中?如果你试图执行exit(0),你需要'exit'调用的地址,并推送0以外的参数作为参数:)
不,我不想调用libc exit ()函数,但我想执行系统调用退出的程序集中断。这里的参数传递给寄存器。我使用exit(0)shellcode,因为它很短并且易于测试。而且我正在溢出%ebp,所以当主函数返回%eip时会指向缓冲区的某处,这就是为什么我使用了0x90 NOP的原因。 – user3102158