簡體   English   中英

Notesearch利用異常(黑客:剝削藝術)

[英]The Notesearch Exploit anomalies (Hacking: Art of Exploitation)

這個問題是關於“黑客:剝削藝術”第二版第121頁上的程序筆記研究的漏洞利用。

在漏洞利用中有一些我不理解的東西:

當系統執行./notesearch'xyz ....'時,參數'xyz ...'溢出子程序中的字符串緩沖區,從而覆蓋返回地址....這很清楚。

這里的假設是notesearch程序的堆棧幀位於調用exploit的Stack幀之上。 當編譯版本存在於同一系統上時,這也適用。

我的第一個問題是1.這是否會像遠程黑客一樣工作?

我的第二個問題是2.由於緩沖區已用於覆蓋包括返回地址在內的所有變量,因此notesearch程序如何按預期工作? 像“打印”等變量位於這個堆棧框架中並決定是否打印消息似乎都能正常工作。 即使調用函數位於相關堆棧幀的頂部,其中正在被泛洪的字符串緩沖區位於其中,也存在某些將被覆蓋的關鍵變量。

問題沒有。 3.鑒於String緩沖區是在執行notesearch開始后推入的新堆棧幀的一部分,緩沖區將覆蓋該notesearch程序中的所有給定變量。 緩沖區也是搜索字符串的值。 由於程序邏輯由於搜索字符串與消息不匹配,因此程序不應輸出用戶消息的詳細信息。 在這種情況下,會顯示消息。 我想知道為什么?

(供參考:本書是http://www.tinker.tv/download/hacking2_sample.pdf ,代碼可從http://www.nostarch.com/hacking2.htm免費下載。)

繼續讀這本書; 另一個例子在第122頁給出,然后有大量的解釋性文本告訴所有有關漏洞的內容。

這是notesearch代碼的相關部分:

int main(int argc, char *argv[]) {
    int userid, printing=1, fd; // file descriptor
    char searchstring[100];

    if(argc > 1)                        // If there is an arg
        strcpy(searchstring, argv[1]);   //   that is the search string
    else                                // otherwise
        searchstring[0] = 0;             //   search string is empty

    userid = getuid();
    fd = open(FILENAME, O_RDONLY);   // open the file for read-only access

你寫了:

這里的假設是notesearch程序的堆棧幀位於調用exploit的Stack幀之上。

不,那是錯的。 這里只有一個堆棧框架相關: notesearch main()函數的堆棧框架。 我們調用的事實./notesearch xyz...通過一個system()內調用exploit_notesearch是無關緊要的; 我們也可以直接在bash命令行上調用./notesearch xyz... ,或者欺騙其他一些進程(例如,你知道, bash )代表我們執行它。

  1. 即使是遠程黑客,這還能工作嗎?

當然。

  1. 由於緩沖區已被用於覆蓋包括返回地址在內的所有變量,因此notesearch程序如何按預期工作?

嗯,它並沒有真正按預期工作。 再看一下輸出:

reader@hacking:~/booksrc $ gcc exploit_notesearch.c
reader@hacking:~/booksrc $ ./a.out
[DEBUG] found a 34 byte note for user id 999
[DEBUG] found a 41 byte note for user id 999
-------[ end of note data ]-------
sh-3.2#

明確給你一個殼不算“按預期工作”。 但即便在此之前,該程序聲稱在/var/notes找到了用戶ID 999的/var/notes ,這可能表明它有點混亂。 在我們作為惡意黑客的角色中,我們並不關心來自notesearch程序的垃圾輸出; 我們關心的是它最終到達main()的末尾並返回我們的shellcode,讓我們可以訪問shell。

但是,如果您想知道我們如何設法覆蓋返回地址而不覆蓋本地變量useridprintingfd ,那么至少有三種顯而易見的可能性:

searchstring 可能這些變量是在堆棧上的searchstring下面分配的。

B.也許這些變量是在寄存器中而不是在堆棧中分配的。

C.很大可能,這些變量覆蓋,但其初始值根本無關緊要的程序。 例如, userid可以獲取任何值,因為該垃圾值將立即被下一行的getuid()覆蓋。 初始值很重要的唯一變量是printing 甚至printing只有在碰巧得到值0時才改變程序的行為 - 它不能得到值0 ,因為我們復制的數據完全由非零字節組成。

我想你真的不明白什么是緩沖區溢出。 該searchstring變量最初位於堆棧上100個字節。 現在,您將一大塊緩沖區復制到searchstring中,而不檢查它的長度。 因此緩沖區溢出到notesearch主函數的堆棧幀的其他部分。 返回地址也會被覆蓋。 這就是它的工作原理。

我認為這里最重要的假設是notesearch堆棧類似於 exploit_notesearch 這就是為什么他使用exploit_notesearch局部變量(unsigned int i)來計算ret 他假設(當然,知道notesearch的源代碼),當兩個程序都加載到內存中時,它們將具有相似的幀地址(大約為0xffff7 ..)當然,2個程序不共享內存,它們是不同的進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM