2014-09-27 55 views
2

我正在學習各種漏洞,我無法理解格式字符串漏洞。我在一個允許利用漏洞的環境中設置了一個相當簡單的程序。瞭解格式字符串漏洞

int woah(char *arg){ 
char buf[200]; 
snprintf(buf, sizeof buf, arg); 
return 0; 
} 

我能控制ARG被傳遞到這將是攻擊將如何與運行我的shellcode,給我根程序的最終結果發生的作用。讓程序崩潰很容易,只需要爲它提供「%s%s」並且它會發生段錯誤。我們想要做的比這更多,所以我們給它提供類似「AAAA%x%x%x%x%x%x%x」的東西。看看gdb中的程序,我們看看snprinf後的緩衝區,我們可以看到:

"AAAA849541414141353934....blah blah blah" 

這很好!我們可以看到堆棧中的A以及以十六進制表示的41。但接下來會發生什麼?我知道這裏的一般想法是用四個字節覆蓋指令指針,方法是將地址放在我們輸入的字符串的起始位置,然後沿着該行的某處指向我們的shellcode。

我將如何找到要覆蓋的seip/return地址的地址?

+0

您看到的A不在堆疊中。他們正在打印,因爲你的格式字符串這樣說。 41的是...指導哪個方向?什麼是問題? – ericbn 2014-09-27 22:17:17

+0

爲清晰起見進行了編輯。我認爲這個漏洞的下一步是找到指令指針,這樣我就可以用指向我的緩衝區的地址覆蓋它。我如何找到這兩個地址? – OneManRiot 2014-09-27 22:32:20

+0

[Format string bugs - exploitation]的可能重複(http://stackoverflow.com/questions/5052648/format-string-bugs-exploitation) – ericbn 2014-09-27 22:34:11

回答

0

當調用snprintf()時,會創建一個棧幀 - 內存區域來執行它的函數語句。但是,在發生這種情況之前,編譯器需要知道該函數的前一個調用者 - 返回點地址。該地址包含在堆棧幀中,因此當堆棧解開時,即該功能正在完成其工作,它將返回到該地址,以便程序可以繼續運行。你要做的是用你的shellcode地址覆蓋這個地址。研究更多關於堆棧幀,ESP,EBP,EIP的想法。