Buffer overflow
- C kursu
- Uzman
- Ders 19/47
- 5 dk
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
#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
#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
char buf[8]; strcpy(buf, ____);
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 |