Uninitialized Variables
Informazioni di Base
L'idea principale qui è capire cosa succede con le variabili non inizializzate poiché avranno il valore che era già presente nella memoria assegnata a loro. Esempio:
Funzione 1:
initializeVariable
: Dichiarando una variabilex
e assegnandole un valore, diciamo0x1234
. Quest'azione è simile a riservare uno spazio in memoria e mettervi un valore specifico.Funzione 2:
useUninitializedVariable
: Qui, dichiariamo un'altra variabiley
ma non le assegnamo alcun valore. In C, le variabili non inizializzate non vengono automaticamente impostate a zero. Invece, mantengono il valore che era stato memorizzato per ultimo nella loro posizione di memoria.
Quando eseguiamo queste due funzioni in sequenza:
In
initializeVariable
,x
viene assegnata un valore (0x1234
), che occupa un indirizzo di memoria specifico.In
useUninitializedVariable
,y
viene dichiarata ma non viene assegnato alcun valore, quindi prende il posto di memoria subito dopox
. A causa della mancata inizializzazione diy
, finisce per "ereditare" il valore dalla stessa posizione di memoria utilizzata dax
, poiché è l'ultimo valore che c'era.
Questo comportamento illustra un concetto chiave nella programmazione a basso livello: La gestione della memoria è cruciale, e le variabili non inizializzate possono portare a comportamenti imprevedibili o vulnerabilità di sicurezza, poiché potrebbero contenere involontariamente dati sensibili lasciati in memoria.
Le variabili non inizializzate nello stack potrebbero comportare diversi rischi per la sicurezza come:
Fuga di Dati: Informazioni sensibili come password, chiavi di crittografia o dettagli personali possono essere esposti se memorizzati in variabili non inizializzate, consentendo agli attaccanti di potenzialmente leggere questi dati.
Divulgazione di Informazioni: I contenuti delle variabili non inizializzate potrebbero rivelare dettagli sulla struttura di memoria del programma o sulle operazioni interne, aiutando gli attaccanti nello sviluppo di exploit mirati.
Blocchi e Instabilità: Operazioni che coinvolgono variabili non inizializzate possono comportare comportamenti non definiti, portando a blocchi del programma o a risultati imprevedibili.
Esecuzione di Codice Arbitrario: In determinati scenari, gli attaccanti potrebbero sfruttare queste vulnerabilità per alterare il flusso di esecuzione del programma, consentendo loro di eseguire codice arbitrario, che potrebbe includere minacce di esecuzione remota di codice.
Esempio
Come Funziona:
Funzione
initializeAndPrint
: Questa funzione dichiara una variabile interainitializedVar
, le assegna il valore100
, e poi stampa sia l'indirizzo di memoria che il valore della variabile. Questo passaggio è diretto e mostra come si comporta una variabile inizializzata.Funzione
demonstrateUninitializedVar
: In questa funzione, dichiariamo una variabile interauninitializedVar
senza inizializzarla. Quando tentiamo di stamparne il valore, l'output potrebbe mostrare un numero casuale. Questo numero rappresenta qualunque dato fosse precedentemente presente in quella posizione di memoria. A seconda dell'ambiente e del compilatore, l'output effettivo può variare e talvolta, per sicurezza, alcuni compilatori potrebbero inizializzare automaticamente le variabili a zero, anche se non ci si dovrebbe basare su questo.Funzione
main
: La funzionemain
chiama entrambe le funzioni sopra in sequenza, dimostrando il contrasto tra una variabile inizializzata e una non inizializzata.
Esempio ARM64
Questo non cambia affatto in ARM64 poiché le variabili locali sono gestite anche nello stack, puoi controllare questo esempio dove ciò è mostrato.
Last updated