Desarrollo de Exploits - Buffer Overflow

 

El desbordamiento de búfer (buffer overflow) es una de las vulnerabilidades más conocidas en la programación en C. A pesar de su antigüedad, sigue siendo relevante y en este artículo vamos a ver un ejemplo concreto y simple de cómo esta vulnerabilidad puede modificar el comportamiento de un programa. También veremos cómo evitar este tipo de errores.

El código vulnerable

A continuación, les dejo un programita en C que contiene una vulnerabilidad por desbordamiento de búfer. Con un poco de humor, claro esta, porque nadie dijo que escribir en C tenía que ser aburrido.


En este código, la variable nombre tiene espacio para 8 caracteres, y control es una variable entera que debería mantener su valor inicial (cero). El problema ocurre porque se usa la función gets(), que no verifica el tamaño del input que se ingresa por teclado. Esto permite que un usuario escriba más caracteres de los que caben en nombre, sobrescribiendo la memoria adyacente, en este caso, la variable control.

Qué acontece al ejecutar el programa

Al ejecutarse, el programa solicita un nombre por pantalla. Si el usuario introduce una cadena corta (menor o igual a 7 caracteres), el flujo es normal y se imprime un saludo. Sin embargo, si se introduce una cadena más larga (por ejemplo, 12 caracteres), parte de esa cadena termina sobrescribiendo la variable control.

Esto hace que la condición if (control != 0) se cumpla, ejecutando un bloque de código inesperado.

Hasta aquí no hay problemas porque Billy tiene menos de 8 caractéres. Pero que ¿pasa si superamos esa cifra?



¿Por qué pasa esto?

En C, las variables locales como nombre y control se almacenan en la pila (stack). Al escribir más de 8 caracteres en nombre, los bytes adicionales pisan las siguientes posiciones de memoria, incluyendo control. Este tipo de comportamiento es típico en desbordamientos de búfer, y puede ser explotado para ejecutar código arbitrario en escenarios más complejos.

En este caso, simplemente vemos cómo se modifica una variable crítica, lo cual ya es suficiente para demostrar la peligrosidad del error.

En el mundo real, una vulnerabilidad como esta no solo puede alterar el comportamiento de un programa, sino que también puede ser aprovechada para ejecutar código arbitrario, escalar privilegios o comprometer completamente un sistema. Históricamente, los desbordamientos de búfer han sido la base de muchos exploits graves, permitiendo a atacantes inyectar shellcode, redirigir el flujo de ejecución o incluso cargar puertas traseras. Aunque hoy en día existen protecciones como ASLR, DEP o stack canaries, siguen apareciendo programas vulnerables, especialmente en sistemas embebidos, software legado o desarrollos sin buenas prácticas de seguridad. Por eso, entender estas fallas no solo es importante para prevenir errores en el código propio, sino también para analizar, auditar o defender sistemas reales ante ataques que siguen vigentes.

Popular posts from this blog

El estado de la Criptografía Cuántica en 2025 - Parte I

Por qué los "aspirantes a hackers" abandonan (y cómo evitarlo)