mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
66 lines
4.4 KiB
Markdown
66 lines
4.4 KiB
Markdown
|
# Neinicijalizovane promenljive
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Drugi načini podrške HackTricks-u:
|
||
|
|
||
|
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||
|
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||
|
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
## Osnovne informacije
|
||
|
|
||
|
Osnovna ideja ovde je razumeti šta se dešava sa **neinicijalizovanim promenljivima jer će imati vrednost koja je već bila u dodeljenoj memoriji.** Primer:
|
||
|
|
||
|
* **Funkcija 1: `initializeVariable`**: Deklarisali smo promenljivu `x` i dodelili joj vrednost, recimo `0x1234`. Ova akcija je slična rezervisanju mesta u memoriji i postavljanju određene vrednosti u nju.
|
||
|
* **Funkcija 2: `useUninitializedVariable`**: Ovde deklarišemo drugu promenljivu `y` ali joj ne dodeljujemo nikakvu vrednost. U programskom jeziku C, neinicijalizovane promenljive se ne postavljaju automatski na nulu. Umesto toga, zadržavaju vrednost koja je poslednja bila sačuvana na njihovoj memorijskoj lokaciji.
|
||
|
|
||
|
Kada pokrenemo ove dve funkcije jednu za drugom:
|
||
|
|
||
|
1. U `initializeVariable`, `x` dobija vrednost (`0x1234`), koja zauzima određenu memorijsku adresu.
|
||
|
2. U `useUninitializedVariable`, `y` je deklarisana ali joj nije dodeljena vrednost, pa zauzima memorijsko mesto odmah posle `x`. Zbog nedostatka inicijalizacije `y`, završava "nasleđujući" vrednost sa iste memorijske lokacije koju koristi `x`, jer je to poslednja vrednost koja je bila tamo.
|
||
|
|
||
|
Ovo ponašanje ilustruje ključni koncept u programiranju na niskom nivou: **Upravljanje memorijom je ključno**, a neinicijalizovane promenljive mogu dovesti do nepredvidivog ponašanja ili bezbednosnih ranjivosti, jer mogu nenamerno zadržavati osetljive podatke ostavljene u memoriji.
|
||
|
|
||
|
### Primer
|
||
|
```c
|
||
|
#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;
|
||
|
}
|
||
|
```
|
||
|
#### Kako ovo funkcioniše:
|
||
|
|
||
|
* **Funkcija `initializeAndPrint`**: Ova funkcija deklariše celobrojnu promenljivu `initializedVar`, dodeljuje joj vrednost `100`, a zatim štampa kako memorijsku adresu tako i vrednost promenljive. Ovaj korak je jednostavan i pokazuje kako se ponaša inicijalizovana promenljiva.
|
||
|
* **Funkcija `demonstrateUninitializedVar`**: U ovoj funkciji deklarišemo celobrojnu promenljivu `uninitializedVar` bez inicijalizacije. Kada pokušamo da odštampamo njenu vrednost, izlaz može pokazati nasumičan broj. Taj broj predstavlja bilo koje podatke koji su prethodno bili na toj memorijskoj lokaciji. Zavisno od okruženja i kompajlera, stvarni izlaz može varirati, a ponekad, radi bezbednosti, neki kompajleri automatski inicijalizuju promenljive na nulu, iako se na to ne bi trebalo oslanjati.
|
||
|
* **Funkcija `main`**: Funkcija `main` poziva obe prethodne funkcije jednu za drugom, demonstrirajući kontrast između inicijalizovane i neinicijalizovane promenljive.
|