# Uninitialized Variables {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} ## Basic Information G艂贸wna idea tutaj polega na zrozumieniu, co si臋 dzieje z **niezainicjowanymi zmiennymi, poniewa偶 b臋d膮 one mia艂y warto艣膰, kt贸ra ju偶 znajdowa艂a si臋 w przydzielonej pami臋ci.** Przyk艂ad: * **Funkcja 1: `initializeVariable`**: Deklarujemy zmienn膮 `x` i przypisujemy jej warto艣膰, powiedzmy `0x1234`. Ta akcja jest podobna do rezerwacji miejsca w pami臋ci i umieszczenia w nim konkretnej warto艣ci. * **Funkcja 2: `useUninitializedVariable`**: Tutaj deklarujemy inn膮 zmienn膮 `y`, ale nie przypisujemy jej 偶adnej warto艣ci. W C, niezainicjowane zmienne nie s膮 automatycznie ustawiane na zero. Zamiast tego, zachowuj膮 warto艣膰, kt贸ra by艂a ostatnio przechowywana w ich lokalizacji pami臋ci. Kiedy uruchamiamy te dwie funkcje **sekwencyjnie**: 1. W `initializeVariable`, `x` otrzymuje warto艣膰 (`0x1234`), kt贸ra zajmuje okre艣lony adres pami臋ci. 2. W `useUninitializedVariable`, `y` jest deklarowane, ale nie przypisano mu warto艣ci, wi臋c zajmuje miejsce w pami臋ci tu偶 po `x`. Z powodu nieinicjowania `y`, ko艅czy si臋 na "dziedziczeniu" warto艣ci z tej samej lokalizacji pami臋ci u偶ywanej przez `x`, poniewa偶 to by艂a ostatnia warto艣膰, kt贸ra tam by艂a. To zachowanie ilustruje kluczow膮 koncepcj臋 w programowaniu niskiego poziomu: **Zarz膮dzanie pami臋ci膮 jest kluczowe**, a niezainicjowane zmienne mog膮 prowadzi膰 do nieprzewidywalnego zachowania lub luk w zabezpieczeniach, poniewa偶 mog膮 niezamierzenie przechowywa膰 wra偶liwe dane pozostawione w pami臋ci. Niezainicjowane zmienne stosu mog膮 stwarza膰 kilka zagro偶e艅 bezpiecze艅stwa, takich jak: * **Wycieki danych**: Wra偶liwe informacje, takie jak has艂a, klucze szyfrowania lub dane osobowe, mog膮 by膰 ujawnione, je艣li s膮 przechowywane w niezainicjowanych zmiennych, co pozwala atakuj膮cym na potencjalne odczytanie tych danych. * **Ujawnienie informacji**: Zawarto艣膰 niezainicjowanych zmiennych mo偶e ujawnia膰 szczeg贸艂y dotycz膮ce uk艂adu pami臋ci programu lub wewn臋trznych operacji, co pomaga atakuj膮cym w opracowywaniu ukierunkowanych exploit贸w. * **Awaria i niestabilno艣膰**: Operacje zwi膮zane z niezainicjowanymi zmiennymi mog膮 prowadzi膰 do nieokre艣lonego zachowania, co skutkuje awariami programu lub nieprzewidywalnymi wynikami. * **Wykonanie dowolnego kodu**: W niekt贸rych scenariuszach, atakuj膮cy mog膮 wykorzysta膰 te luki, aby zmieni膰 przep艂yw wykonania programu, co umo偶liwia im wykonanie dowolnego kodu, co mo偶e obejmowa膰 zagro偶enia zwi膮zane z zdalnym wykonaniem kodu. ### Example ```c #include // 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; } ``` #### Jak to dzia艂a: * **Funkcja `initializeAndPrint`**: Ta funkcja deklaruje zmienn膮 ca艂kowit膮 `initializedVar`, przypisuje jej warto艣膰 `100`, a nast臋pnie drukuje zar贸wno adres pami臋ci, jak i warto艣膰 zmiennej. Ten krok jest prosty i pokazuje, jak zachowuje si臋 zainicjowana zmienna. * **Funkcja `demonstrateUninitializedVar`**: W tej funkcji deklarujemy zmienn膮 ca艂kowit膮 `uninitializedVar` bez jej inicjalizacji. Gdy pr贸bujemy wydrukowa膰 jej warto艣膰, wynik mo偶e pokaza膰 losow膮 liczb臋. Ta liczba reprezentuje dane, kt贸re wcze艣niej znajdowa艂y si臋 w tej lokalizacji pami臋ci. W zale偶no艣ci od 艣rodowiska i kompilatora, rzeczywisty wynik mo偶e si臋 r贸偶ni膰, a czasami, dla bezpiecze艅stwa, niekt贸re kompilatory mog膮 automatycznie inicjowa膰 zmienne do zera, chocia偶 na tym nie nale偶y polega膰. * **Funkcja `main`**: Funkcja `main` wywo艂uje obie powy偶sze funkcje w kolejno艣ci, demonstruj膮c kontrast mi臋dzy zainicjowan膮 a niezainicjowan膮 zmienn膮. ## Przyk艂ad ARM64 To w og贸le si臋 nie zmienia w ARM64, poniewa偶 zmienne lokalne s膮 r贸wnie偶 zarz膮dzane na stosie, mo偶esz [**sprawdzi膰 ten przyk艂ad**](https://8ksec.io/arm64-reversing-and-exploitation-part-6-exploiting-an-uninitialized-stack-variable-vulnerability/), gdzie to jest pokazane. {% hint style="success" %} Ucz si臋 i 膰wicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Ucz si臋 i 膰wicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wsparcie HackTricks * Sprawd藕 [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Do艂膮cz do** 馃挰 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **艣led藕** nas na **Twitterze** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Dziel si臋 trikami hackingowymi, przesy艂aj膮c PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytori贸w github.
{% endhint %}