2011-11-20 46 views
5

我試圖對給定的易受攻擊代碼執行緩衝區溢出攻擊。 但它似乎錯了,因爲雖然我的漏洞利用字符串不會破壞堆棧,但我無法獲得我的彙編代碼(嵌入在漏洞利用字符串中)。沒有函數包含所選幀的程序計數器

這是執行我想要攻擊的程序的'ret'指令之前的一段內存值。

0x55683984:  0x5568398c 0x...(old r.a)  0x68e322a1  0x0000c31c 
0x55683994:  0xf7fa9400  0x0804a3d7  0x556839c0  0xf7e518d0 

在這一點上,事情出錯了,因爲它不能彈出堆棧並使%eip指向彈出的值?所以我的漏洞彙編代碼不起作用。(0x68e322a1 0x0000c31c) Gdb說沒有函數包含所選幀的程序計數器。當我試圖在不進行調試的情況下執行它時,會導致分段錯誤。

這個問題與我的程序集的長度有關嗎? (在這種情況下是6)?

Program received signal SIGSEGV, Segmentation fault. 
0x5568398c in ??() 
(gdb) x 0x5568398c 
0x5568398c: 0x68e322a1 

當我能夠看到導致段錯誤的地址內容時,會發生這種情況嗎?

+0

你可以用'disassemble'或'X/10I $ eip',看看它segfaulted和代碼'bt'查看調用堆棧。如果你顯示你正在執行的代碼,它會更容易幫助(如果它是68 e3 ..它看起來像嵌入了零字節)。順便說一句,如果這是作業,你應該把它標記爲這樣。 – user786653

+0

我使用佈局asm來查看發生了什麼,並沒有幫助。而且,既然我的漏洞利用代碼以c3結尾(意味着ret指令),那麼零字節就不成問題。這裏的關鍵點是我無意中嘗試訪問可能未定義的內存地址。 – bfaskiplar

回答

3

好的,這裏是我忘記在我的彙編代碼中的movl指令地址前放置'$'的故事。因此,程序試圖訪問導致分段錯誤的未定義內存地址。

但是,我不喜歡GDB說通知這一情況的方式只是「無功能包含選定的框架程序計數器」

+0

謝謝你,你救了我的培根 – JustGage

5

默認情況下disassemble打印出當前函數的代碼。在你的情況下,程序計數器指向某處堆棧,gdb不會理解當前函數的邊界在哪裏。這就是爲什麼錯誤信息。

但你可以手動指定地址範圍的拆解:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff 
+1

非常好的把戲。或者,您可以使用反彙編$ rip,$ rip + offset來緩解計算堆棧幀位置的痛苦 – Eric