Uninitialized Variables

Support HackTricks

Basic Information

Wazo kuu hapa ni kuelewa kinachotokea na mabadiliko yasiyoanzishwa kwani yatakuwa na thamani ambayo tayari ilikuwa katika kumbukumbu iliyotengwa kwao. Mfano:

  • Kazi 1: initializeVariable: Tunatangaza mabadiliko x na kupewa thamani, tuseme 0x1234. Kitendo hiki ni sawa na kuhifadhi mahali katika kumbukumbu na kuweka thamani maalum ndani yake.

  • Kazi 2: useUninitializedVariable: Hapa, tunatangaza mabadiliko mengine y lakini hatupeleki thamani yoyote. Katika C, mabadiliko yasiyoanzishwa hayapewi moja kwa moja thamani sifuri. Badala yake, yanabaki na thamani yoyote iliyokuwa imehifadhiwa mwisho katika eneo lao la kumbukumbu.

Tunapokimbia kazi hizi 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 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 mabadiliko yasiyoanzishwa yanaweza kusababisha tabia isiyotabirika au udhaifu wa usalama, kwani yanaweza bila kukusudia kushikilia data nyeti iliyobaki katika kumbukumbu.

Mabadiliko yasiyoanzishwa katika stack yanaweza kuleta hatari kadhaa za usalama kama:

  • Kuvuja kwa Data: Taarifa nyeti kama nywila, funguo za usimbuaji, au maelezo binafsi yanaweza kufichuliwa ikiwa yatahifadhiwa katika mabadiliko yasiyoanzishwa, na kuwapa washambuliaji uwezo wa kusoma data hii.

  • Ufunuo wa Taarifa: Maudhui ya mabadiliko yasiyoanzishwa yanaweza kufichua maelezo kuhusu mpangilio wa kumbukumbu wa programu au operesheni za ndani, na kusaidia washambuliaji katika kuendeleza mashambulizi yaliyolengwa.

  • Kuanguka na Kutokuwa na Utulivu: Operesheni zinazohusisha mabadiliko yasiyoanzishwa zinaweza kusababisha tabia isiyofafanuliwa, na kusababisha kuanguka kwa programu au matokeo yasiyotabirika.

  • Utendaji wa Nambari Isiyo na Mpangilio: Katika hali fulani, washambuliaji wanaweza kutumia udhaifu huu kubadilisha mtiririko wa utekelezaji wa programu, na kuwapa uwezo wa kutekeleza nambari isiyo na mpangilio, ambayo inaweza kujumuisha vitisho vya utekelezaji wa nambari ya mbali.

Example

#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 Kazi: Kazi hii inatangaza kiambato cha nambari initializedVar, inakipatia thamani 100, na kisha inachapisha anwani ya kumbukumbu na thamani ya kiambato. Hatua hii ni rahisi na inaonyesha jinsi kiambato kilichowekwa thamani kinavyofanya kazi.

  • demonstrateUninitializedVar Kazi: Katika kazi hii, tunatangaza kiambato cha nambari uninitializedVar bila kukiweka thamani. 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 mkusanyiko, matokeo halisi yanaweza kutofautiana, na wakati mwingine, kwa usalama, baadhi ya wakusanyaji wanaweza kuanzisha kiambato kuwa sifuri, ingawa hii haipaswi kutegemewa.

  • main Kazi: Kazi ya main inaita kazi zote mbili hapo juu kwa mpangilio, ikionyesha tofauti kati ya kiambato kilichowekwa thamani na kisichowekwa thamani.

Mfano wa ARM64

Hii haibadilishi hata kidogo katika ARM64 kwani viambato vya ndani pia vinashughulikiwa katika stack, unaweza kuangalia mfano huu ambapo hii inaonyeshwa.

Support HackTricks

Last updated