Variables No Inicializadas
Reading time: 4 minutes
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
Informaci贸n B谩sica
La idea principal aqu铆 es entender qu茅 sucede con las variables no inicializadas ya que tendr谩n el valor que ya estaba en la memoria asignada a ellas. Ejemplo:
- Funci贸n 1:
initializeVariable
: Declaramos una variablex
y le asignamos un valor, digamos0x1234
. Esta acci贸n es similar a reservar un espacio en la memoria y poner un valor espec铆fico en 茅l. - Funci贸n 2:
useUninitializedVariable
: Aqu铆, declaramos otra variabley
pero no le asignamos ning煤n valor. En C, las variables no inicializadas no se establecen autom谩ticamente en cero. En cambio, retienen el 煤ltimo valor que se almacen贸 en su ubicaci贸n de memoria.
Cuando ejecutamos estas dos funciones secuencialmente:
- En
initializeVariable
,x
se le asigna un valor (0x1234
), que ocupa una direcci贸n de memoria espec铆fica. - En
useUninitializedVariable
,y
se declara pero no se le asigna un valor, por lo que toma el espacio de memoria justo despu茅s dex
. Debido a que no se inicializay
, termina "heredando" el valor de la misma ubicaci贸n de memoria utilizada porx
, porque ese es el 煤ltimo valor que estuvo all铆.
Este comportamiento ilustra un concepto clave en la programaci贸n de bajo nivel: La gesti贸n de memoria es crucial, y las variables no inicializadas pueden llevar a un comportamiento impredecible o vulnerabilidades de seguridad, ya que pueden contener involuntariamente datos sensibles que quedan en la memoria.
Las variables de pila no inicializadas podr铆an presentar varios riesgos de seguridad como:
- Filtraci贸n de Datos: Informaci贸n sensible como contrase帽as, claves de cifrado o detalles personales pueden ser expuestos si se almacenan en variables no inicializadas, permitiendo a los atacantes potencialmente leer estos datos.
- Divulgaci贸n de Informaci贸n: El contenido de las variables no inicializadas podr铆a revelar detalles sobre el dise帽o de la memoria del programa o las operaciones internas, ayudando a los atacantes a desarrollar exploits dirigidos.
- Ca铆das e Inestabilidad: Las operaciones que involucran variables no inicializadas pueden resultar en un comportamiento indefinido, llevando a ca铆das del programa o resultados impredecibles.
- Ejecuci贸n de C贸digo Arbitrario: En ciertos escenarios, los atacantes podr铆an explotar estas vulnerabilidades para alterar el flujo de ejecuci贸n del programa, permiti茅ndoles ejecutar c贸digo arbitrario, lo que podr铆a incluir amenazas de ejecuci贸n remota de c贸digo.
Ejemplo
#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;
}
C贸mo Funciona Esto:
initializeAndPrint
Function: Esta funci贸n declara una variable enterainitializedVar
, le asigna el valor100
y luego imprime tanto la direcci贸n de memoria como el valor de la variable. Este paso es sencillo y muestra c贸mo se comporta una variable inicializada.demonstrateUninitializedVar
Function: En esta funci贸n, declaramos una variable enterauninitializedVar
sin inicializarla. Cuando intentamos imprimir su valor, la salida puede mostrar un n煤mero aleatorio. Este n煤mero representa cualquier dato que estaba previamente en esa ubicaci贸n de memoria. Dependiendo del entorno y del compilador, la salida real puede variar, y a veces, por seguridad, algunos compiladores pueden inicializar autom谩ticamente las variables a cero, aunque esto no debe ser confiado.main
Function: La funci贸nmain
llama a ambas funciones anteriores en secuencia, demostrando el contraste entre una variable inicializada y una no inicializada.
Ejemplo ARM64
Esto no cambia en absoluto en ARM64 ya que las variables locales tambi茅n se gestionan en la pila, puedes ver este ejemplo donde se muestra esto.
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.