ASLR
- C kursu
- Uzman
- Ders 21/47
- 5 dk
ASLR ile adres alanı rastgeleleştirmeyi öğrenirsin.
ASLR nedir?
ASLR (Address Space Layout Randomization), program her çalıştığında bellek bölgelerinin konumlarını rastgeleleştirir. Kod, yığın, öbek ve kitaplıklar farklı adreslere yerleşir.
Saldırgan bir açık bulsa bile, hedef adresini önceden bilemediği için saldırı başarısız olur. Linux'ta /proc/sys/kernel/randomize_va_space ile denetlenir: 0 kapalı, 1 kısmi, 2 tam. Derleyici -fPIE seçeneğiyle programı konumdan bağımsız yapar; bu ASLR'in tam çalışması için gerekir. ASLR tek başına yeterli değildir; canary ve güvenli fonksiyonlarla birlikte kullanılır.
PIE ve ASLR etkileşimi
PIE (Position Independent Executable), program kodunun herhangi bir adrese yüklenebilmesini sağlar. PIE olmadan ASLR yalnızca yığını ve öbeği rastgeleleştirir; kod segmenti sabit kalır.
Derleyici -fPIE ile derler, bağlayıcı -pie ile bağlar. Bu ikisi birlikte çalışınca programın kendisi de rastgele adrese yerleşir. Saldırgan artık kod içindeki gadget adreslerini önceden bilemez; ROP saldırıları zorlaşır. Üretim derlemelerinde PIE varsayılan açıktır. Yine de en önemli savunma, açık yazmamak: sınır denetimi yapmayan fonksiyonlardan kaçınmak.
Uygulama Bellek bölgesi bilgisi yazdır
void print_aslr_info(const char *region, int base) fonksiyonunu tanımla; gövdesi printf("%s=%d\n", region, base); olsun. main içinde üç bölge için çağır: ("text", 4194304), ("stack", 65536), ("heap", 1048576).
Başlangıç kodu
#include <stdio.h>
// print_aslr_info fonksiyonunu tanımla
// text, stack, heap için (ad, taban) ile çağır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
void print_aslr_info(const char *region, int base) {
printf("%s=%d\n", region, base);
}
int main(void) {
print_aslr_info("text", 4194304);
print_aslr_info("stack", 65536);
print_aslr_info("heap", 1048576);
return 0;
}Beklenen çıktı
text=4194304 stack=65536 heap=1048576
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 ASLR durum iletisini tamamla
printf("ASLR: %s
", enabled ? "ON" : "____");
printf("ASLR: %s
", enabled ? "ON" : "OFF");
Açıklama: ASLR kapalıysa "OFF" yazdırılır.
2 Bellek bölgelerini eşle
| Kavram | Anlamı |
|---|---|
text |
Kod segmenti |
stack |
Yığın |
heap |
Öbek |
library |
Kitaplık |
3 ASLR neyi rastgeleştirir?
- Bellek bölgesi konumlarını Doğru cevap
- Yalnız tarih bilgisini
- Yalnız dosya adını
- Yalnız kullanıcı adını
Açıklama: ASLR bellek bölgelerinin adreslerini rastgeleleştirir.