hacktricks/binary-exploitation/stack-overflow/uninitialized-variables.md

5.6 KiB

Variables Zisizojulikana

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na htARTE (Mtaalamu wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Wazo kuu hapa ni kuelewa kinachotokea na variables zisizojulikana kwani zitakuwa na thamani iliyokuwepo tayari kwenye kumbukumbu iliyowekwa kwao. Mfano:

  • Fungtion 1: initializeVariable: Tunatangaza variable x na kumpa thamani, sema 0x1234. Hatua hii inafanana na kuhifadhi nafasi kwenye kumbukumbu na kuweka thamani maalum ndani yake.
  • Fungtion 2: useUninitializedVariable: Hapa, tunatangaza variable nyingine y lakini hatumpi thamani yoyote. Katika C, variables zisizojulikana hazipati moja kwa moja thamani ya sifuri. Badala yake, zinabaki na thamani yoyote iliyokuwa imesalia kwenye eneo la kumbukumbu.

Tunapotekeleza hizi fungtions kwa mpangilio:

  1. Katika initializeVariable, x anapewa thamani (0x1234), ambayo inachukua anwani maalum ya kumbukumbu.
  2. Katika useUninitializedVariable, y inatangazwa lakini haipewi thamani, hivyo inachukua nafasi ya kumbukumbu mara baada ya x. Kutokana na kutokuiweka y, inamalizia "kurithi" thamani kutoka kwenye eneo la kumbukumbu linalotumiwa na x, kwa sababu hiyo ndiyo thamani ya mwisho iliyokuwepo hapo.

Tabia hii inaonyesha dhana muhimu katika programu za kiwango cha chini: Usimamizi wa kumbukumbu ni muhimu, na variables zisizojulikana zinaweza kusababisha tabia isiyoaminika au mapungufu ya usalama, kwani wanaweza kushikilia data nyeti isiyokusudiwa iliyobaki kwenye kumbukumbu.

Variables zisizojulikana kwenye steki zinaweza kuleta hatari kadhaa za usalama kama:

  • Kuvuja kwa Data: Taarifa nyeti kama nywila, funguo za kuchakata, au maelezo ya kibinafsi yanaweza kufichuliwa ikiwa yamehifadhiwa kwenye variables zisizojulikana, kuruhusu wadukuzi kusoma data hii.
  • Kufichua Taarifa: Yaliyomo ya variables zisizojulikana yanaweza kufunua maelezo kuhusu muundo wa kumbukumbu ya programu au shughuli za ndani, kusaidia wadukuzi katika kuendeleza mashambulizi yaliyolengwa.
  • Kuanguka na Kutokuwa na Utulivu: Operesheni zinazohusisha variables zisizojulikana zinaweza kusababisha tabia isiyoeleweka, ikisababisha programu kuanguka au matokeo yasiyotabirika.
  • Utekelezaji wa Kanuni za Kiholela: Katika hali fulani, wadukuzi wanaweza kutumia mapungufu haya kubadilisha mtiririko wa utekelezaji wa programu, kuwaruhusu kutekeleza kanuni za kiholela, ambazo zinaweza kujumuisha vitisho vya utekelezaji wa kanuni za mbali.

Mfano

#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:

  • Fungua initializeAndPrint: Hii fungsi inatangaza kipengele cha nambari initializedVar, inampa thamani 100, na kisha inachapisha anwani ya kumbukumbu na thamani ya kipengele. Hatua hii ni wazi na inaonyesha jinsi kipengele kilichoinuliwa kinavyotenda.
  • Fungua demonstrateUninitializedVar: Katika fungsi hii, tunatangaza kipengele cha nambari uninitializedVar bila kuipatia thamani. Tunapojaribu kuchapisha thamani yake, matokeo yanaweza kuonyesha nambari ya nasibu. Nambari hii inawakilisha data yoyote iliyokuwepo hapo awali katika eneo hilo la kumbukumbu. Kulingana na mazingira na mtoaji wa programu, matokeo halisi yanaweza kutofautiana, na mara nyingine, kwa usalama, baadhi ya watoaji wa programu wanaweza kiotomatiki kuinua vipengele kuwa sifuri, ingawa hii haipaswi kutegemewa.
  • Fungua kuu: Fungsi ya kuanza inaita fungsi zote mbili hapo juu kwa mfululizo, ikionyesha tofauti kati ya kipengele kilichoinuliwa na kile ambacho hakijainuliwa.

Mfano wa ARM64

Hii haibadiliki kabisa katika ARM64 kwani vipengele vya ndani pia vinasimamiwa kwenye stakishi, unaweza kuchunguza mfano huu ambapo hili linaonyeshwa.