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. explicacion Exploiting desbordamiento de buffer en pila


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 explicacion Exploiting desbordamiento de buffer en pila

    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.
    Desbordamiento de bufer detectado con GCC



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




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. debug desensamblado IDA free 01



  • 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)

debug desensamblado IDA free



  • Si me organizo las ventanas para ver el codigo , la memoria y el programa a la vez Deberia tener algo parecido a esto:

debug desensamblado IDA free

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.

debug_y_desensamblado_cutter_radare2_00



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.

debug_y_desensamblado_cutter_radare2_01

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