Desbordamiento de Bufer (01Apuntes)
Siguiento el Ultimo curso de Exploiting y reversing por Ricardo Narvaja.
Me Pongo a practicar con un desbordamiento de bufer en pila/stack sencillo.
Aqui dejo los apuntes/write up de dicho estudio.
Antes de nada el articulo Original lo tienes aqui:
https://ciberseguridad.blog/exploiting-y-reversing-usando-herramientas-gratuitas-parte-ii/
Te recomiendo que lo leas.
Esta bien estructurado.
Combina muy bien la teoria de exploting con los conocimientos de programacion.
Asi que como no me gusta copiar el trabajo de otros. Prefiero que lo leas.
Recuerda: En la categoria Apuntes Voy a poner apuntes y notas de los proyectos que tengo en marcha.
No son articulos conpletos.
Pero te pueden ayudar a resolver dudas , problemas y tener referencias.
Puede ser que el nivel de conocimientos necesario sea un poco alto.
Indice:
1) Codigo ejercicio-stack01
2) razones code blocks
3) instalacion-code-blocks
4) analisis con ida free
5) analisis con cutter / radare2
Notas
Referencias
Codigo Ejercicio stack01
Voy a coger el ejercicio Ataque “Smash the stack” y le voy a añadir/modificar codigo para que se vea mas claro el desbordamiento de buffer. Codigo Original Aqui fundacion-sadosky => practica1
#include <stdio.h>
int main() {
int orilla=0;
char rio_buf[8];
printf(" Direccion orilla: %08x \n Direccion rio_buf: %08x \n", &orilla, &rio_buf );
printf(" Valor orilla: %d \n\n", orilla );
if(&orilla < &rio_buf) printf("¡¡¡El Desbordamiento de rio_buff no altera a orilla)!!!\n\n");
printf("Introduce rio_buf(8caracteres;) ");
gets(rio_buf);
printf("\n rio_buf: %s \n Valor orilla: %dd = %Xh (deberia seguir siendo 0)\n\n",rio_buf,orilla,orilla);
return 0;
}
Una version Todavia mas simple. (para que se entienda).
#include <stdio.h>
int main() {
int orilla=0;
char rio_buf[8];
printf("Introduce buf(8caracteres): ");
gets(rio_buf);
printf("\n rio_buf: %s \n Orilla: %d (deberia ser 0)\n",rio_buf,orilla);
}
Codigo y el programa corriendo en Code-Blocks Windows.
Como se ve en la imagen:
Si introduzco 9 caracteres en lugar de 8.
el caracter 9 acaba inundando la zona de memoria de la variable adjunta. (orilla)
Que pasa a tener un valor de 57 Valor (Ascii del 9) en lugar de 0 (valor original)
Asi que si meto rio mas caudal/datos del que tengo asignado se acabara desbordando e inundando la orilla. alterando su contenido.
Aqui teneis el Codigo y el programa corriendo en Code-Blocks linux
-
Nota(Linux):
Con linux He tenido que usar el compilador Tiny C Compiler (tcc)
ya que los ultimos compiladores linux traen protecciones contra desbordamientos de buffer.
y desabilitarlas me parecia mas complicado que usar tcc. (
apt-get install tcc
)
Como se ve en la imagen en linux con GCC el desbordamiento aparte de ser detectado. no funciona como se esperaba.

Voy a Utilizar Code-Blocks Por las siguientes Razones:
- Hay versión Linux y Windows
- Facil instalacion. (version windows portable. )
- Soporte para varios compiladores a la vez. ( GNU GCC , Tiny C Compiler, Visual C…)
- Posibilidad de compilar el mismo codigo con varios compiladores. (perfecto para estos ejercicios)
- Interfaz similar linux/windows.
- Es mas o menos “ligero” (unos 250Mb)
- el codigo generado es mas ligero. (mejor para no complicarnos en el reversing).
En windows la version GCC pesa 29kb mientras que la version tcc solo pesa 2kb
Y en Linux 11,1kb y 3,3kb respectivamente
Instalacion Code-Blocks
- Windows http://www.codeblocks.org/downloads/binaries
- Linux (Incluido en casi todas las distros. usando los repositorios) http://www.codeblocks.org/downloads/binaries
Analisis con IDA free
https://www.hex-rays.com/products/ida/support/download_freeware/
Para Analizar la aplicacion desde IDA he cogido el primer codigo. (porque me indica las posiciones de memoria que me ayudaran a localizar donde estan las variables.)
Todavia no estoy Muy practico con IDA como para hacer un tuto.
Asi que dejo unos breves apuntes.
- Abro el ejecutable con IDA => new => disasemble new file
- Acepto las opciones por defecto para la decompilacion del ejecutable.
- Voy a una linea de codigo en la zona en la que pide la entrada de datos. Introduce rio_buf
- Boton derecho y selecciono Add Breackpoint F2
Deberia quedar una linea marcada en rojo. con el punto de interrupcion.
- Menu Debugger > start process
- Para ver el espacio de memoria de las variables. Selecciono var_c => boton derecho => Jump in a new window o Jump in a new hex window
- Tambien puedo renombrarla a su nombre real (rio_buff) con boton derecho => rename.
- Para ver los datos de 1 en 1 byte
En un area libre de la ventana ventana/pestaña con los datos en hexadecimal
Pulso: Boton derecho => colums => 1 - Compruebo que las direcciones coinciden con lo que indica el programa.(en mi caso fac26d3c y fac26d34)
- Si me organizo las ventanas para ver el codigo , la memoria y el programa a la vez Deberia tener algo parecido a esto:
Como se ve en la imagen.
Queda un poco mas claro como se ha generado el desbordamiento de buffer
Analisis con _Cutter / Radare2
La verdad es que cutter me esta sorprendiendo.
Al abrir el programa el desensamblado se acerca mucho al codigo original.
Aunque para depurar (debugear) he tenido que hacerlo en remoto. (conect to a remote debugger)
, arrancar un debug en modo servidor. gdbserver 127.0.0.1:2345 stack1-in_tcc
y luego conectarme al debugger con debug => conect to a remote debugger.
De momento En cutter cuesta un poco mas encontrar la zona de memoria con las variables.
De momentp lo he conseguido de la siguiente forma:
- Deleccionar una variable => boton derecho => show in => new Hexdump.
- Despues seleccionar el registro RAX (despues de ejecutar una instruccion lea)
- y boton derecho => show in =>hexdump 0
Notas.
Recuerda son unos apuntes.
Esta explicado solo por encima.
Referencias
Segunta parte del curso exploiting-y-reversing-usando-herramientas-gratuitas de Ricardo Narvaja.
https://ciberseguridad.blog/exploiting-y-reversing-usando-herramientas-gratuitas-parte-ii/fundacion-sadosky: Guía de auto-estudio para la escritura de exploits
https://github.com/fundacion-sadosky/guia-escritura-exploits
https://fundacion-sadosky.github.io/guia-escritura-exploits/Ejercicios exploiting Gerardo Richarte.
https://github.com/gerasdf/InsecureProgramming/
Tiny_C_Compiler (necesario para que buffer overflow funcione en linux)
https://en.wikipedia.org/wiki/Tiny_C_Compiler
http://download.savannah.gnu.org/releases/tinycc/Cutter (radare) https://github.com/radareorg/cutter/releases#downloads
Ultima version 32bits: https://github.com/radareorg/cutter/releases/download/v1.7.4/Cutter-v1.7.4-x86.Windows.zip