CodeBlanks Logo Icon CodeBlanks

Buffer overflow

Buffer overflow güvenlik açığını öğrenirsin.

Buffer overflow nedir?

Buffer overflow (tampon taşması), bir dizinin sınırlarının ötesine yazılmasıdır. Yaygın bir güvenlik açığıdır; özellikle strcpy ve gets gibi sınır denetimsiz fonksiyonlardan kaynaklanır.

C'de diziler sınır denetimi yapmaz; char buf[8] için dokuzuncu baytın yazılması derleyicinin yakalamadığı bir bellek hatasıdır. Yığıt (stack) taşmasında saldırgan dönüş adresinin üzerine yazarak program akışını ele geçirebilir. Bu yüzden modern derleyiciler canary ve ASLR gibi korumalar ekler. Güvenli fonksiyonlar (fgets, strncpy) açıkça boyut ister.

Yığıt düzeni ve dönüş adresi

Bir fonksiyon çağrısında yığıt sırayla yerel değişkenler, kayıt edilmiş kayıtlar ve dönüş adresi barındırır. Buffer overflow bu yapıyı bozar.

Eğer yerel dizi taşarsa, sıradaki baytlar önce diğer değişkenleri, sonra dönüş adresini yazar. Saldırgan bunu kötü niyetli bir adresle değiştirirse, fonksiyon döndüğünde saldırganın koduna atlar. Bu yüzden strcpy yerine strncpy, gets yerine fgets kullanılır. Derleyici -fstack-protector seçeneğiyle dönüş adresinden önce rastgele bir canary koyar; dönüşte eşleşmezse program durur.

Uygulama Tampon denetimi yap

void check_buf(const char *name, int size, int used) fonksiyonunu tanımla. if (used > size) ise printf("%s: OVERFLOW\n", name);, değilse printf("%s: OK\n", name); yazsın. main içinde üç çağrı yap: ("buf", 8, 5), ("input", 16, 16), ("dst", 4, 8).

Başlangıç kodu

main.c
#include <stdio.h>

// check_buf fonksiyonunu tanımla
// buf, input, dst için (ad, boyut, kullanım) ile çağır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

void check_buf(const char *name, int size, int used) {
    if (used > size) {
        printf("%s: OVERFLOW\n", name);
    } else {
        printf("%s: OK\n", name);
    }
}

int main(void) {
    check_buf("buf", 8, 5);
    check_buf("input", 16, 16);
    check_buf("dst", 4, 8);
    return 0;
}

Beklenen çıktı

buf: OK
input: OK
dst: OVERFLOW

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Buffer overflow ne zaman olur?

  • İşlemci hızlı olunca
  • Bellek boş olunca
  • Tampon sınırı aşılınca Doğru cevap
  • Dosya kapandı

Açıklama: Dizinin kapasitesinin ötesine yazmak taşmaya neden olur.

2 Güvensiz strcpy çağrısını tamamla

Soru
char buf[8]; strcpy(buf, ____);
Cevap
char buf[8]; strcpy(buf, input);

Açıklama: strcpy sınır denetimi yapmaz; input 8 bayttan uzunsa taşar.

3 Yığıt kavramlarını eşle

Kavram Anlamı
buffer Tampon
stack Yığın
return address Dönüş adresi
overflow Taşma

Uzman bölümündeki tüm dersler