CodeBlanks Logo Icon CodeBlanks

Stack canary

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

main.c
#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

main.c
#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

Soru
if (canary != ____) abort();
Cevap
if (canary != expected) abort();

Açıklama: expected, fonksiyon girişinde yazılan canary değeridir.

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