CTF Çözümleri

Buffer Overflow (Stack-Based) Temelleri

ugrkrbck 🔴 · 2026-09-12 21:20:27
Konu: Metodoloji · Belirli bir platform/odaya değil, genel yaklaşıma odaklıdır. Buffer Overflow (Arabellek Taşması), en klasik ve temel yazılım zafiyet kategorilerinden biridir. Modern işletim sistemlerinde ASLR, DEP/NX gibi korumalar bu saldırıyı zorlaştırsa da, temel mantığını anlamak hâlâ güvenlik eğitiminin vazgeçilmez bir parçasıdır (bu nedenle CTF'lerde ve OSCP tarzı sertifikasyonlarda sıkça karşımıza çıkar). ■ 1. Zafiyetin Temeli Bir programda, sabit boyutlu bir bellek alanına (buffer), o alanın boyutunu aşan veri yazıldığında, fazla veri bitişik bellek alanlarının üzerine taşar. Eğer bu taşma dikkatli şekilde kontrol edilirse, programın dönüş adresi (return address) üzerine yazılarak akış saldırganın istediği yöne yönlendirilebilir. ■ 2. Test Ortamı (Yalnızca Laboratuvar!) Bu teknikler sadece izole, kendi kurduğun bir test ortamında denenmelidir. Basit bir zafiyetli C programı örneği: #include <string.h> void vulnerable(char *input) { char buffer[64]; strcpy(buffer, input); // sınır kontrolü yok! } strcpy, hedef buffer'ın boyutunu kontrol etmez — bu, klasik bir buffer overflow zafiyetidir. ■ 3. Fuzzing: Çökme Noktasını Bulma İlk adım, programın hangi girdi uzunluğunda çöktüğünü (crash) bulmaktır: import socket buffer = b"A" * 100 while True: try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("<hedef-ip>", 9999)) s.send(buffer) s.close() buffer += b"A" * 100 except: print(f"Çöktü, uzunluk: {len(buffer)}") break ■ 4. Offset Bulma (Pattern Bulma) Dönüş adresinin tam olarak hangi bayt konumunda üzerine yazıldığını bulmak için, Metasploit'in pattern_create ve pattern_offset araçları kullanılır: msf-pattern_create -l 200 Bu, benzersiz bir bayt dizisi üretir; program çöktüğünde debugger'da (örn. Immunity Debugger + Mona.py) görülen EIP/RIP değeri, pattern_offset ile tam offset konumuna çevrilir. ■ 5. Kontrolü Ele Geçirme Doğru offset bulunduktan sonra, dönüş adresi kontrollü bir şekilde üzerine yazılabilir — genellikle bir JMP ESP talimatının bellek adresiyle, akış saldırganın kendi shellcode'una yönlendirilir. buffer = b"A" * offset + jmp_esp_address + shellcode ■ 6. Modern Korumalar (Neden Bu Kadar Basit Değil) Gerçek dünyada bu saldırıyı zorlaştıran katmanlar: - ASLR (Address Space Layout Randomization): Bellek adreslerini her çalıştırmada rastgeleleştirir. - DEP/NX (Data Execution Prevention): Veri alanlarının çalıştırılabilir kod olarak işletilmesini engeller. - Stack Canaries: Buffer ile dönüş adresi arasına konan, değiştirilirse çökmeyi tetikleyen bir "koruma değeri". Bu korumaların hepsini aşmak (ROP - Return Oriented Programming gibi ileri tekniklerle) ayrı ve çok daha derin bir konudur. ■ Öğrenilen Dersler - Buffer overflow, "eski" bir konu gibi görünse de bellek güvenliği prensiplerini anlamanın temelidir. - Güvenli programlama dillerine geçiş (Rust gibi bellek-güvenli diller), bu zafiyet sınıfını kaynağında ortadan kaldırmanın en kalıcı yoludur. - strcpy, gets gibi sınır kontrolü yapmayan C fonksiyonları yerine strncpy, fgets gibi güvenli alternatifler kullanılmalıdır.

0 ana yorum

Yorum yapmak için giriş yap.

KVKK Aydınlatma Metni · Çerez Politikası