Uninitialized Variables
Temel Bilgiler
Buradaki temel fikir, başlatılmamış değişkenlerin belleğe atanan değeri alacaklarını anlamaktır. Örnek:
Fonksiyon 1:
initializeVariable
: Bir değişkenx
bildiriyoruz ve ona bir değer atıyoruz, diyelim ki0x1234
. Bu eylem, bellekte bir yer ayırmak ve belirli bir değeri koymak gibidir.Fonksiyon 2:
useUninitializedVariable
: Burada, başka bir değişkeny
bildiriyoruz ancak ona herhangi bir değer atamıyoruz. C'de başlatılmamış değişkenler otomatik olarak sıfıra ayarlanmaz. Bunun yerine, bellek konumlarındaki son depolanan değeri korurlar.
Bu iki fonksiyonu ardışık olarak çalıştırdığımızda:
initializeVariable
içinde,x
bir değer atandı (0x1234
), bu belirli bir bellek adresini işgal eder.useUninitializedVariable
içinde,y
bildirilir ancak bir değer ataması yapılmaz, bu nedenlex
'in hemen ardından bellek yeri alır.y
'yi başlatmadığımızdan,x
tarafından kullanılan aynı bellek konumundan değeri "miras" alır, çünkü orada en son olan değer odur.
Bu davranış, düşük seviyeli programlamada önemli bir kavramı gösterir: Bellek yönetimi önemlidir ve başlatılmamış değişkenler, hassas verileri yanlışlıkla bellekte bırakabileceğinden, öngörülemeyen davranışlara veya güvenlik açıklarına yol açabilir.
Başlatılmamış yığın değişkenleri çeşitli güvenlik riskleri oluşturabilir:
Veri Sızıntısı: Hassas bilgiler, şifreler, şifreleme anahtarları veya kişisel detaylar gibi, başlatılmamış değişkenlerde saklanıyorsa, saldırganların bu verileri potansiyel olarak okumasına izin vererek açığa çıkabilir.
Bilgi Açıklaması: Başlatılmamış değişkenlerin içeriği, programın bellek düzeni veya iç işleyişi hakkında detayları ortaya çıkarabilir, bu da saldırganların hedefe yönelik saldırılar geliştirmelerine yardımcı olabilir.
Çökmeler ve Kararsızlık: Başlatılmamış değişkenleri içeren işlemler tanımsız davranışlara neden olabilir, program çökmelerine veya öngörülemeyen sonuçlara yol açabilir.
Keyfi Kod Yürütme: Belirli senaryolarda, saldırganlar bu açıkları kullanarak programın yürütme akışını değiştirebilir ve onlara keyfi kod yürütme, uzaktan kod yürütme tehditlerini içerebilecek şekilde programı değiştirme imkanı verebilir.
Örnek
Nasıl Çalışır:
initializeAndPrint
Fonksiyonu: Bu fonksiyon bir tamsayı değişkeni olaninitializedVar
'ı bildirir, değer olarak100
atar ve ardından değişkenin bellek adresini ve değerini yazdırır. Bu adım açıktır ve başlatılmış bir değişkenin nasıl davrandığını gösterir.demonstrateUninitializedVar
Fonksiyonu: Bu fonksiyonda, başlatılmamış bir tamsayı değişkeni olanuninitializedVar
'ı bildiriyoruz. Değişkenin değerini yazdırmaya çalıştığımızda, çıktı rastgele bir sayı gösterebilir. Bu sayı, önceki bellek konumunda bulunan veriyi temsil eder. Ortama ve derleyiciye bağlı olarak, gerçek çıktı değişebilir ve bazen güvenlik için bazı derleyiciler değişkenleri otomatik olarak sıfırlayabilir, ancak buna güvenilmemelidir.main
Fonksiyonu:main
fonksiyonu yukarıdaki iki fonksiyonu sırayla çağırarak başlatılmış bir değişken ile başlatılmamış bir değişken arasındaki farkı gösterir.
ARM64 Örneği
Bu, ARM64'te hiç değişmez çünkü yerel değişkenler de yığında yönetilir, bu örneği kontrol edebilirsiniz burada bu gösterilmiştir.
Last updated