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.