C
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Canary kavramlarını eşle
- canary
- Rastgele değer
- SSP
- Yığın koruyucu
- prologue
- Fonksiyon girişi
- epilogue
- Fonksiyon çıkışı
-
Stack canary neyi algılar?
- Bellek sızıntısını
- Döngü hatasını
- Tip uyumsuzluğunu
- Yığın taşmasını
Cevabı göster
Yığın taşmasını — Canary yığın taşmasını yakalar ve programı durdurur.
-
Canary denetimini tamamla
if (canary != ____) abort();
Cevabı göster
if (canary != expected) abort();
Sıradaki ders: ASLR