我在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.
不,我不想調用libc exit ()函數,但我想執行系統調用退出的程序集中斷。這裏的參數傳遞給寄存器。我使用exit(0)shellcode,因爲它很短並且易於測試。而且我正在溢出%ebp,所以當主函數返回%eip時會指向緩衝區的某處,這就是爲什麼我使用了0x90 NOP的原因。 – user3102158