Buffer Overflow Nedir? Uygulamalı Bir Rehber
Buffer overflow'ların gerçekte nasıl çalıştığını C örneği, stack diyagramı ve kendiniz görebileceğiniz araçlarla öğrenin.
Buffer overflow, bir program sabit boyutlu bellek bloğuna o blok'un tutabileceğinden daha fazla veri yazması durumunda meydana gelir. Ekstra baytlar bitişik belleğe taşar ve bu buffer'ın yanında ne olduğuna bağlı olarak değişkenleri bozabilir, programı çökertilebilir veya yürütme akışını tamamen ele geçirebilirsiniz. Bu, yazılım güvenliğindeki en eski hata sınıflarından biridir ve hâlâ CTF'lerde, CVE'lerde ve gömülü yazılımda karşımıza çıkmaktadır.
Güvenlik açığı olan kalıp
İşte C'de klasik bir örnek:
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpy kendisine geçirilen herhangi bir string'i buffer'a kopyalar, sınır kontrolü yapılmaz. argv[1] 64 bayt'tan uzunsa, kopya dizinin sonunun ötesine devam eder. Stack üzerinde buffer diğer yerel değişkenlerin, kaydedilen register'ların ve sonunda CPU'ya greet() bittiğinde nereye atlanacağını söyleyen dönüş adresinin altında yer alır. O dönüş adresini kontrol ettiğiniz bir adresle üzerine yazın, ve sırada ne çalışacağını kontrol edersiniz.
Bunu neden hâlâ derlenip çalışır
C ve C++ ham diziler üzerinde otomatik sınır kontrolü yapmaz. strcpy, gets, sprintf ve strcat gibi fonksiyonlar null terminator'ı veya kaynak uzunluğunu umursasalar da, hedefteki gerçek boyutu değil, buffer'ın sonunun ötesine yazacaktır. Bunu strncpy veya snprintf ile karşılaştırın, bunlar açık bir boyut argümanı alır ve orada durur. Güvenlik açığı gerçekten de
AI yardımıyla yazıldı, Michal Pilch (CISSP), Korra Studio tarafından incelendi ve yayınlandı.
Bu, Korra Studio bilgi tabanından bir nottur — platform her konuyu 1-to-1 mentoring ile eşleştirir.
Ücretsiz başlaarrow_forward