1.實驗內容
(1).掌握反彙編與十六進位制程式設計器
(2).能正確修改機器指令改變程式執行流程
(3).能正確構造payload進行bof攻擊
2.實驗過程
(1).直接修改程式機器指令,改變程式執行流程
將pwn1檔案放入共享資料夾,後續在kali中使用,再將檔案複製到實驗資料夾share路徑下
找到本次實驗所用的三個程式碼片段foo、main和getshell
all 8048491 "是彙編指令
是說這條指令將呼叫位於地址8048491處的foo函式;
其對應機器指令為“e8 d7ffffff”,e8即跳轉之意。
本來正常流程,此時此刻EIP的值應該是下條指令的地址,即80484ba,但如一解釋e8這條指令呢,CPU就會轉而執行 “EIP + d7ffffff”這個位置的指令。“d7ffffff”是補碼,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491這個值,main函式呼叫foo,對應機器指令為“ e8 d7ffffff”,
那我們想讓它呼叫getShell,只要修改“d7ffffff”為,"getShell-80484ba"對應的補碼就行。
用Windows計算器,直接 47d-4ba就能得到補碼,是c3ffffff。
下面我們就修改可執行檔案,將其中的call指令的目標地址由d7ffffff變為c3ffffff。
下面是修改過程:
在終端輸入vi pwn20222417 ,開啟檔案後為亂碼
輸入:%!xxd進入16進位制模式
後找到e8 d7的位置將d7修改為e3,修改結果如下:
執行檔案後得到shell提示符,操作成功
(2).透過構造輸入引數,造成BOF攻擊,改變程式執行流
確認輸入字串哪幾個字元會覆蓋到返回地址:
第一次輸入1111111122222222333333334444444455555555
第二次輸入1111111122222222333333334444444412345678
確認用什麼值來覆蓋返回地址
getShell的記憶體地址,透過反彙編時可以看到,即0804847d。
接下來要確認下位元組序,簡單說是輸入11111111222222223333333344444444\x08\x04\x84\x7d,還是輸入11111111222222223333333344444444\x7d\x84\x04\x08。
修改前的eip為
修改後的eip為
對比之前 eip 0x34333231 0x34333231 ,正確應用輸入 11111111222222223333333344444444\x7d\x84\x04\x08。
由為我們沒法透過鍵盤輸入\x7d\x84\x04\x08這樣的16進位制值,所以先生成包括這樣字串的一個檔案。\x0a表示回車,如果沒有的話,在程式執行時就需要手工按一下Enter鍵。
可以使用16進位制檢視指令xxd檢視input檔案的內容是否如預期。
然後將input的輸入,透過管道符“|”,作為pwn1的輸入。
(3).注入Shellcode並執行
準備一段Shellcode \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
注入bof攻擊
找到程序號
再開另外一個終端,用gdb來除錯pwn1這個程序
在原終端摁下enter
找到01020304的返回地址,shellcode為緊挨著的下一個地址0xffffd300
最後根據shellcode的地址更改並注入
輸入ls得到正確結果
3.問題及解決方法
問題:在實驗的過程中,發現execstack這個指令無法應用。
解決方法:剛開始採用了sudo apt-get upgrade指令進行下載,發現仍舊無法執行,後透過查閱資料發現該指令無法成功安裝,後使用外部官網進行安裝步驟,官網連結為:http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb。
安裝好後使用sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb命令進行解壓,最終安裝成功。
4.學習感悟、思考等
在實驗的最開始,首先需要安裝kali虛擬機器,在經過網上教程安裝完畢後,我開始了本次的實驗內容。本次實驗我瞭解到許多關於緩衝區溢位攻擊的原理的相關知識。再根據指導書一步一步完成的時候,豐富了我的動手能力。在進行緩衝區溢位攻擊時,我體驗到了精確控制程式執行流的複雜性。透過構造特定的輸入字串來覆蓋返回地址,我成功地將程式的執行流程引導至getShell函式。這個過程不僅鍛鍊了我的程式設計技巧,也提高了我對程式記憶體佈局和棧操作的理解。最重要的是,我對於網路攻防這門課有了更深的認識,同時還學習了Linux下的機器指令與彙編,讓我收穫良多。
參考資料
《0x11_MAL_逆向與Bof基礎.md》