Uninitialized Variables

htARTE (HackTricks AWS Red Team Expert) ile AWS hacklemeyi sıfırdan ileri seviyeye öğrenin!

HackTricks'i desteklemenin diğer yolları:

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şken x bildiriyoruz ve ona bir değer atıyoruz, diyelim ki 0x1234. Bu eylem, bellekte bir yer ayırmak ve belirli bir değeri koymak gibidir.

  • Fonksiyon 2: useUninitializedVariable: Burada, başka bir değişken y 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:

  1. initializeVariable içinde, x bir değer atandı (0x1234), bu belirli bir bellek adresini işgal eder.

  2. useUninitializedVariable içinde, y bildirilir ancak bir değer ataması yapılmaz, bu nedenle x'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

#include <stdio.h>

// Function to initialize and print a variable
void initializeAndPrint() {
int initializedVar = 100; // Initialize the variable
printf("Initialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&initializedVar, initializedVar);
}

// Function to demonstrate the behavior of an uninitialized variable
void demonstrateUninitializedVar() {
int uninitializedVar; // Declare but do not initialize
printf("Uninitialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&uninitializedVar, uninitializedVar);
}

int main() {
printf("Demonstrating Initialized vs. Uninitialized Variables in C\n\n");

// First, call the function that initializes its variable
initializeAndPrint();

// Then, call the function that has an uninitialized variable
demonstrateUninitializedVar();

return 0;
}

Nasıl Çalışır:

  • initializeAndPrint Fonksiyonu: Bu fonksiyon bir tamsayı değişkeni olan initializedVar'ı bildirir, değer olarak 100 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 olan uninitializedVar'ı 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