Stack canary
- C kursu
- Uzman
- Ders 20/47
- 5 dk
Stack canary ile koruma öğrenirsin.
Stack canary nedir?
Stack canary, fonksiyon dönüş adresinden önce yerleştirilen rastgele bir değerdir. Dönüşte bu değer değişmişse program taşma olduğunu anlar ve durur.
Derleyici -fstack-protector seçeneğiyle bu korumayı ekler. Fonksiyon girişinde prologue rastgele canary değerini yığıta yazar; çıkışta epilogue aynı değeri bekler. Eğer taşma canary'i değiştirdiyse, __stack_chk_fail çağrılır ve program sonlanır. Canary değeri her çalıştırmada farklı olduğundan saldırgan tahmin edemez. Bu yöntem SSP (Stack Smashing Protector) adıyla bilinir.
Canary denetimi
Canary denetimi iki adımda çalışır: fonksiyon girişinde canary yığıta yazılır, çıkışında beklenen değerle karşılaştırılır. Eşleşmezse program güvenli biçimde sonlanır.
Derleyici bu denetimi otomatik ekler; programcının canary kodu yazması gerekmez. Yine de güvenli fonksiyon kullanımı önemlidir: canary yalnızca taşmayı yakalar, taşmayı önlemez. Yani canary bir alarm, önlem değil. Bazı saldırılar canary'i atlatmanın yollarını arar; bu yüzden ek korumalar (ASLR, PIE) birlikte kullanılır. Birden fazla koruma katmanı savunmayı güçlendirir.
Uygulama Canary denetimi yap
int check_canary(unsigned int saved, unsigned int expected) fonksiyonunu tanımla. if (saved == expected) ise return 1;, değilse return 0; döndürsün. main içinde iki çağrı yap: 0xDEADBEEF, 0xDEADBEEF ve 0xDEADBEEF, 0xCAFEBABE. Sonuçları printf("ok=%d\n", ...) ve printf("bad=%d\n", ...) ile yazdır.
Başlangıç kodu
#include <stdio.h>
// check_canary fonksiyonunu tanımla
// iki durum için çağır ve ok=/bad= yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
int check_canary(unsigned int saved, unsigned int expected) {
if (saved == expected) {
return 1;
}
return 0;
}
int main(void) {
int ok = check_canary(0xDEADBEEF, 0xDEADBEEF);
int bad = check_canary(0xDEADBEEF, 0xCAFEBABE);
printf("ok=%d\n", ok);
printf("bad=%d\n", bad);
return 0;
}Beklenen çıktı
ok=1 bad=0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Canary kavramlarını eşle
| Kavram | Anlamı |
|---|---|
canary |
Rastgele değer |
SSP |
Yığın koruyucu |
prologue |
Fonksiyon girişi |
epilogue |
Fonksiyon çıkışı |
2 Stack canary neyi algılar?
- Bellek sızıntısını
- Döngü hatasını
- Tip uyumsuzluğunu
- Yığın taşmasını Doğru cevap
Açıklama: Canary yığın taşmasını yakalar ve programı durdurur.
3 Canary denetimini tamamla
if (canary != ____) abort();
if (canary != expected) abort();
Açıklama: expected, fonksiyon girişinde yazılan canary değeridir.