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

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 variable x y le asignamos un valor, digamos 0x1234. 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 variable y 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:

  1. En initializeVariable, x se le asigna un valor (0x1234), que ocupa una direcci贸n de memoria espec铆fica.
  2. En useUninitializedVariable, y se declara pero no se le asigna un valor, por lo que toma el espacio de memoria justo despu茅s de x. Debido a que no se inicializa y, termina "heredando" el valor de la misma ubicaci贸n de memoria utilizada por x, 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

c
#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 entera initializedVar, le asigna el valor 100 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 entera uninitializedVar 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贸n main 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