2016-09-29 22 views
7

閱讀「Hacking - The Art of Exploitation」一書;我正在跟隨作者,因爲他通過溢出堆棧和更改函數的返回地址來更改執行流程。 (具體而言,135-136頁),他管理着一個Perl腳本,要做到這一點,進入返回地址作爲命令行參數10倍:用Perl腳本寫入以0x00開頭的地址

$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10') 

其中0x080484bf是返回地址。

我想要做同樣的事情,但我的返回地址以0x00開頭。用\ x00替換\ x08,空字符將被省略,因此我要輸入的地址在存儲器映射中被移位一個字節。我該如何解決這個問題?

+1

我不認爲這是有道理的。 bash不能使用空值處理字符串,但即使這樣做,您也無法將這樣的字符串作爲參數傳遞給進程,因爲exec會期待null結束的字符串,因此它會忽略null後面的所有字符。 – redneb

+0

@redneb我明白了......你能想出任何替代方法來填充內存地址爲dword的地址嗎? (包括以0x00開頭的地址) –

+1

您必須修改'auth_overflow2'來接受例如地址的十六進制表示。 – redneb

回答

7

命令行參數是以NUL結尾的字符串。因此,您不能傳遞包含NUL的字符串。它將被視爲字符串的結尾。

$ perl -e'system("echo", "abc\x00def", "ghi\x00jkl");' 
abc ghi 

瞭解了這一點,Shell在構建參數時剝離了NUL。

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x08" x 5')" 
BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08 

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x00" x 5')" 
BF.84.04.BF.84.04.BF.84.04.BF.84.04.BF.84.04 

auth_overflow2應修改取地址,例如的轉義形式地址以十六進制表示。