2014-02-13 33 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