6.8 KiB
Ungeïnitialiseerde Veranderlikes
{% hint style="success" %}
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
Die kernidee hier is om te verstaan wat gebeur met ungeïnitialiseerde veranderlikes aangesien hulle die waarde sal hê wat reeds in die toegewyde geheue aan hulle was. Voorbeeld:
- Funksie 1:
initializeVariable
: Ons verklaar 'n veranderlikex
en ken dit 'n waarde toe, kom ons sê0x1234
. Hierdie aksie is soortgelyk aan die reservasie van 'n plek in geheue en die plasing van 'n spesifieke waarde daarin. - Funksie 2:
useUninitializedVariable
: Hier verklaar ons 'n ander veranderlikey
maar ken nie enige waarde aan dit toe nie. In C, ongeïnitialiseerde veranderlikes word nie outomaties op nul gestel nie. In plaas daarvan, behou hulle die waarde wat laas op hul geheue ligging gestoor was.
Wanneer ons hierdie twee funksies agtereenvolgens uitvoer:
- In
initializeVariable
, wordx
'n waarde toegeken (0x1234
), wat 'n spesifieke geheue adres beset. - In
useUninitializedVariable
, wordy
verklaar maar nie 'n waarde toegeken nie, so dit neem die geheue plek reg nax
. As gevolg van die nie-initialisering vany
, eindig dit op om die waarde van dieselfde geheue ligging wat deurx
gebruik is, "te erf", omdat dit die laaste waarde was wat daar was.
Hierdie gedrag illustreer 'n sleutelkonsep in lae-vlak programmering: Geheue bestuur is van kardinale belang, en ongeïnitialiseerde veranderlikes kan lei tot onvoorspelbare gedrag of sekuriteitskwesbaarhede, aangesien hulle onbedoeld sensitiewe data wat in geheue gelaat is, kan hou.
Ungeïnitialiseerde stapel veranderlikes kan verskeie sekuriteitsrisiko's inhou soos:
- Data Lek: Sensitiewe inligting soos wagwoorde, versleuteling sleutels, of persoonlike besonderhede kan blootgestel word as dit in ongeïnitialiseerde veranderlikes gestoor word, wat dit moontlik maak vir aanvallers om hierdie data te lees.
- Inligting Onthulling: Die inhoud van ongeïnitialiseerde veranderlikes mag besonderhede oor die program se geheue uitleg of interne operasies onthul, wat aanvallers help om geteikende eksploit te ontwikkel.
- Kras en Onstabiliteit: Operasies wat ongeïnitialiseerde veranderlikes betrek, kan lei tot ongedefinieerde gedrag, wat lei tot program kras of onvoorspelbare uitkomste.
- Arbitraire Kode Uitvoering: In sekere scenario's kan aanvallers hierdie kwesbaarhede benut om die program se uitvoeringsvloei te verander, wat hulle in staat stel om arbitraire kode uit te voer, wat dalk afstandkode-uitvoeringsbedreigings kan insluit.
Voorbeeld
#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;
}
Hoe Dit Werk:
initializeAndPrint
Funksie: Hierdie funksie verklaar 'n heelgetal veranderlikeinitializedVar
, ken dit die waarde100
toe, en druk dan beide die geheueadres en die waarde van die veranderlike. Hierdie stap is eenvoudig en toon hoe 'n geïnitialiseerde veranderlike optree.demonstrateUninitializedVar
Funksie: In hierdie funksie verklaar ons 'n heelgetal veranderlikeuninitializedVar
sonder om dit te initialiseer. Wanneer ons probeer om sy waarde te druk, kan die uitvoer 'n ewekansige getal toon. Hierdie getal verteenwoordig enige data wat voorheen op daardie geheue ligging was. Afhangende van die omgewing en kompilator, kan die werklike uitvoer verskil, en soms, vir veiligheid, kan sommige kompilers veranderlikes outomaties na nul initialiseer, alhoewel daar nie op staatgemaak moet word nie.main
Funksie: Diemain
funksie roep beide van die bogenoemde funksies in volgorde aan, wat die teenstelling tussen 'n geïnitialiseerde veranderlike en 'n nie-geïnitialiseerde een demonstreer.
ARM64 Voorbeeld
Dit verander glad nie in ARM64 nie, aangesien plaaslike veranderlikes ook in die stap bestuur word, jy kan hierdie voorbeeld kyk waar dit getoon word.
{% hint style="success" %}
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.