Uninitialized Variables
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Buradaki temel fikir, başlatılmamış değişkenlerin, kendilerine atanmış bellek alanında zaten bulunan değeri alacağıdır. Örnek:
Fonksiyon 1: initializeVariable
: Bir x
değişkeni tanımlıyoruz ve ona bir değer atıyoruz, diyelim ki 0x1234
. Bu işlem, bellekte bir yer ayırmaya ve oraya belirli bir değer koymaya benzer.
Fonksiyon 2: useUninitializedVariable
: Burada başka bir y
değişkeni tanımlıyoruz ama ona herhangi bir değer atamıyoruz. C dilinde, başlatılmamış değişkenler otomatik olarak sıfıra ayarlanmıyor. Bunun yerine, en son bellekte saklanan değeri koruyorlar.
Bu iki fonksiyonu sırasıyla çalıştırdığımızda:
initializeVariable
içinde, x
bir değer (0x1234
) alır ve bu belirli bir bellek adresini kaplar.
useUninitializedVariable
içinde, y
tanımlanır ama bir değer atanmamıştır, bu nedenle x
'in hemen arkasındaki bellek alanını alır. y
'yi başlatmadığımız için, x
tarafından kullanılan aynı bellek konumundan "miras" alır, çünkü orada bulunan son değer odur.
Bu davranış, düşük seviyeli programlamada önemli bir kavramı gösterir: Bellek yönetimi kritik öneme sahiptir ve başlatılmamış değişkenler, istemeden bellek içinde kalan hassas verileri tutabilecekleri için öngörülemeyen davranışlara veya güvenlik açıklarına yol açabilir.
Başlatılmamış yığın değişkenleri, aşağıdaki gibi birkaç güvenlik riski oluşturabilir:
Veri Sızıntısı: Başlatılmamış değişkenlerde saklanan şifreler, şifreleme anahtarları veya kişisel bilgiler gibi hassas bilgiler ifşa edilebilir, bu da saldırganların bu verileri okumasına olanak tanır.
Bilgi Açığa Çıkması: Başlatılmamış değişkenlerin içeriği, programın bellek düzeni veya iç işlemleri hakkında ayrıntılar ortaya çıkarabilir ve saldırganların hedeflenmiş istismarlar geliştirmesine yardımcı olabilir.
Çökmeler ve Dengesizlik: Başlatılmamış değişkenlerle ilgili işlemler, tanımsız davranışa yol açabilir ve programın çökmesine veya öngörülemeyen sonuçlara neden olabilir.
Rastgele Kod Çalıştırma: Belirli senaryolarda, saldırganlar bu güvenlik açıklarını kullanarak programın yürütme akışını değiştirebilir ve rastgele kod çalıştırmalarına olanak tanıyabilir; bu, uzaktan kod çalıştırma tehditlerini içerebilir.
initializeAndPrint
Fonksiyonu: Bu fonksiyon bir tamsayı değişkeni initializedVar
tanımlar, ona 100
değerini atar ve ardından değişkenin hem bellek adresini hem de değerini yazdırır. Bu adım basittir ve bir başlatılmış değişkenin nasıl davrandığını gösterir.
demonstrateUninitializedVar
Fonksiyonu: Bu fonksiyonda, bir tamsayı değişkeni uninitializedVar
tanımlıyoruz ancak onu başlatmıyoruz. Değerini yazdırmaya çalıştığımızda, çıktı rastgele bir sayı gösterebilir. Bu sayı, o bellek konumunda daha önce bulunan veriyi temsil eder. Ortama ve derleyiciye bağlı olarak, gerçek çıktı değişebilir ve bazen güvenlik nedeniyle bazı derleyiciler değişkenleri otomatik olarak sıfıra başlatabilir, ancak buna güvenilmemelidir.
main
Fonksiyonu: main
fonksiyonu yukarıdaki her iki fonksiyonu sırasıyla çağırarak, başlatılmış bir değişken ile başlatılmamış bir değişken arasındaki farkı gösterir.
Bu, ARM64'te hiç değişmez çünkü yerel değişkenler de yığında yönetilir, bunu bu örnekte kontrol edebilirsiniz görebilirsiniz.
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)