ASLR ve DEP Nedir?

ASLR Nedir?

ASLR (Address Space Layout Randomization), bir güvenlik mekanizmasıdır. Bu mekanizma, bir programın bellekteki adreslerini (örneğin, kod, veri, yığın ve yığın bellek bölgeleri) rastgeleleştirerek çalıştırır. Amaç, bellek tabanlı saldırıları (örneğin, buffer overflow veya return-to-libc saldırıları) zorlaştırmaktır.

ASLR aktif olduğunda, saldırganlar bir bellek adresine erişmeye çalıştıklarında, bu adres her çalıştırmada rastgele değiştiğinden saldırıların başarı olasılığı düşer.

ASLR’nin Özellikleri

 

    • Güvenlik artırıcı bir önlemdir: Rastgeleleştirme sayesinde sabit adreslere dayalı saldırılar başarısız olur.

    • Modern işletim sistemlerinde varsayılan olarak aktiftir: Windows, Linux ve macOS, ASLR’yi destekler.

    • Dezavantajları: Performans kaybı az miktarda olabilir ve bazı eski uygulamalar uyumluluk sorunları yaşayabilir.

ASLR tek başına güvenlik sağlamayacağı ve çeşitli yöntemler ile aşılabileceği için kodunuza ek güvenlik yöntemleri eklemeniz gerekecektir.

DEP Nedir?

DEP (Data Execution Prevention), modern işletim sistemlerinde bulunan bir güvenlik özelliğidir. Bu özellik, bellek alanlarının hem veri hem de kod olarak kullanılmasını engelleyerek yazılım güvenliğini artırır. DEP, özellikle buffer overflow gibi bellek tabanlı saldırılara karşı koruma sağlar.


DEP’nin Çalışma Prensibi

 

    • Bellek bölgesi sınırlaması: DEP, belirli bellek bölgelerinin yalnızca okuma veya yazma için kullanılmasını sağlar. Eğer bir saldırgan bu bölgeleri yürütülebilir (execute) bir alan gibi kullanmaya çalışırsa, DEP bu işlemi engeller ve programı sonlandırır.

    • Donanım ve yazılım desteği: DEP, işlemcinin donanım özellikleriyle veya işletim sisteminin yazılım tabanlı korumalarıyla çalışır.


DEP’nin Faydaları

 

    • Bellek tabanlı saldırılara karşı koruma: DEP, saldırganların kötü amaçlı kodu bellek üzerinden çalıştırmasını zorlaştırır.

    • Saldırı yüzeyini azaltır: Kod yürütme yetkisi olmayan alanlara erişim engellenir.


DEP Nasıl Çalışır?

Bellek alanları üç temel kategoride sınıflandırılır:

 

    1. Kod Bölgesi (Executable): Kodların yürütüldüğü bölge. Sadece kod çalıştırmaya izin verir, veri yazılamaz.

    1. Veri Bölgesi (Non-Executable): Sadece veri yazılabilir, kod çalıştırılamaz.

    1. Okuma/Yazma Alanı: Veri işlemek için kullanılır, kod yürütülemez.

DEP, bir saldırganın bellek bölgesinde depolanan kötü amaçlı kodu çalıştırmasını önler.


DEP’nin C++ ile Örneklenmesi

Aşağıdaki örnekte, DEP’nin etkisini anlamak için bir bellek alanına kötü amaçlı kod yerleştirilip çalıştırılmaya çalışılır. Bu işlem DEP etkin olduğunda başarısız olur.

				
					#include <iostream>
#include <windows.h>

void maliciousFunction() {
    std::cout << "Kötü amaçlı kod çalıştırıldı!" << std::endl;
}

int main() {
    // Bellek bloğu ayır
    void* buffer = VirtualAlloc(nullptr, 4096, MEM_COMMIT, PAGE_READWRITE);
    if (buffer == nullptr) {
        std::cerr << "Bellek ayırma başarısız oldu." << std::endl;
        return 1;
    }

    // Fonksiyon adresini kopyala
    memcpy(buffer, (void*)&maliciousFunction, 4096);

    // Bellek bölgesini çalıştırılabilir hale getir
    DWORD oldProtect;
    if (!VirtualProtect(buffer, 4096, PAGE_EXECUTE_READ, &oldProtect)) {
        std::cerr << "Bellek koruması değiştirilemedi." << std::endl;
        return 1;
    }

    // DEP devre dışı ise, bu kod çalıştırılır.
    auto func = reinterpret_cast<void(*)()>(buffer);
    func();

    // Bellek bölgesini serbest bırak
    VirtualFree(buffer, 0, MEM_RELEASE);

    return 0;
}

				
			

Sonuç

DEP, sistem güvenliği için kritik bir mekanizmadır. Özellikle modern işletim sistemlerinde standart olarak aktif olan bu mekanizma, bellek tabanlı saldırılara karşı etkili bir savunma sağlar. C++ ile yapılan yukarıdaki örnek, DEP’nin çalışma prensibini anlamanıza yardımcı olabilir.

Bu örnek kod Visual Studio da yazılıp derlendiği için DEP aktif veya pasif edildiğinde örnek kodun verdiği sonucu incelemenizi tavsiye ederim.


DEP’yi Visual Studio’da Kontrol Etmek için:

  1. Proje Ayarlarına Erişim:

    • Visual Studio’da projenizi açın.
    • Menüden Project > [Proje Adı] Properties öğesine tıklayın.
  2. Configuration Properties Ayarlarına Git:

    • Açılan pencerede sol menüden Configuration Properties > Linker > Advanced sekmesine gidin.
  3. Data Execution Prevention Ayarını Bulun:

    • Sağ tarafta Data Execution Prevention (DEP) seçeneğini bulun.
    • Buradaki ayarları şu şekilde değiştirin:
      • Default: Sistem varsayılanı kullanılır.
      • Yes (/NXCompat): DEP aktif edilir.
      • No (/NXCompat
        ):
        DEP devre dışı bırakılır.
  4. DEP’yi Aktif Etmek:

    • Ayarı Yes (/NXCompat) olarak seçin.
  5. Değişiklikleri Kaydetmek:

    • Ayarları kaydedin ve projenizi yeniden derleyin.