Uninitialized Variables

Reading time: 4 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

Wazo kuu hapa ni kuelewa kinachotokea na variables zisizokuwa na mwanzo kwani zitakuwa na thamani ambayo tayari ilikuwa katika kumbukumbu iliyotengwa kwao. Mfano:

  • Function 1: initializeVariable: Tunatangaza variable x na kupewa thamani, tuseme 0x1234. Kitendo hiki ni sawa na kuhifadhi mahali katika kumbukumbu na kuweka thamani maalum ndani yake.
  • Function 2: useUninitializedVariable: Hapa, tunatangaza variable nyingine y lakini hatuipatii thamani yoyote. Katika C, variables zisizokuwa na mwanzo hazipati moja kwa moja thamani sifuri. Badala yake, zinashikilia thamani yoyote iliyokuwa imehifadhiwa mwisho katika eneo lao la kumbukumbu.

Tunapokimbia hizi kazi mbili mfululizo:

  1. Katika initializeVariable, x inapata thamani (0x1234), ambayo inachukua anwani maalum ya kumbukumbu.
  2. Katika useUninitializedVariable, y inatangazwa lakini haipati thamani, hivyo inachukua mahali pa kumbukumbu moja baada ya x. Kwa sababu ya kutokuweka mwanzo y, inamaliza "kurithi" thamani kutoka eneo lile lile la kumbukumbu lililotumiwa na x, kwa sababu hiyo ndiyo thamani ya mwisho iliyokuwepo.

Tabia hii inaonyesha dhana muhimu katika programu za kiwango cha chini: Usimamizi wa kumbukumbu ni muhimu, na variables zisizokuwa na mwanzo zinaweza kusababisha tabia isiyotabirika au udhaifu wa usalama, kwani zinaweza bila kukusudia kushikilia data nyeti iliyobaki katika kumbukumbu.

Variables za stack zisizokuwa na mwanzo zinaweza kuleta hatari kadhaa za usalama kama:

  • Data Leakage: Taarifa nyeti kama nywila, funguo za usimbuaji, au maelezo binafsi yanaweza kufichuliwa ikiwa yatahifadhiwa katika variables zisizokuwa na mwanzo, na kuwapa washambuliaji uwezo wa kusoma data hii.
  • Information Disclosure: Maudhui ya variables zisizokuwa na mwanzo yanaweza kufichua maelezo kuhusu mpangilio wa kumbukumbu wa programu au operesheni za ndani, na kuwasaidia washambuliaji kuendeleza mashambulizi yaliyolengwa.
  • Crashes and Instability: Operesheni zinazohusisha variables zisizokuwa na mwanzo zinaweza kusababisha tabia isiyofafanuliwa, na kusababisha programu kuanguka au matokeo yasiyotabirika.
  • Arbitrary Code Execution: Katika hali fulani, washambuliaji wanaweza kutumia udhaifu huu kubadilisha mtiririko wa utekelezaji wa programu, na kuwapa uwezo wa kutekeleza msimbo wa kiholela, ambao unaweza kujumuisha vitisho vya utekelezaji wa msimbo wa mbali.

Example

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;
}

Jinsi Hii Inavyofanya Kazi:

  • initializeAndPrint Function: Kazi hii inatangaza variable ya integer initializedVar, inatoa thamani 100, na kisha inachapisha anwani ya kumbukumbu na thamani ya variable. Hatua hii ni rahisi na inaonyesha jinsi variable iliyoanzishwa inavyofanya kazi.
  • demonstrateUninitializedVar Function: Katika kazi hii, tunatangaza variable ya integer uninitializedVar bila kuanzisha. Tunapojaribu kuchapisha thamani yake, matokeo yanaweza kuonyesha nambari isiyo ya kawaida. Nambari hii inawakilisha data yoyote iliyokuwa hapo awali katika eneo hilo la kumbukumbu. Kulingana na mazingira na compiler, matokeo halisi yanaweza kutofautiana, na wakati mwingine, kwa usalama, baadhi ya compilers zinaweza kuanzisha variable moja kwa moja kuwa sifuri, ingawa hii haipaswi kutegemewa.
  • main Function: Kazi ya main inaita kazi zote mbili hapo juu kwa mpangilio, ikionyesha tofauti kati ya variable iliyoanzishwa na isiyoanzishwa.

Mfano wa ARM64

Hii haibadilishi kabisa katika ARM64 kwani variable za ndani pia zinashughulikiwa katika stack, unaweza kuangalia mfano huu ambapo hii inaonyeshwa.

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks