[FADB] 6.Sobreescritura de la dirección de retorno mediante desbordamiento de buffer

FUNDAMENTOS DE LOS ATAQUES POR DESBORDAMIENTO DE BUFFER

En el apartado anterior hemos visto cómo nuestro código en C sobreescribía mediante un puntero la dirección de retorno de una determinada función. Ahora veamos cómo escribiendo en exceso en un buffer de la pila también podemos sobreescribir la dirección de retorno.

Como ejemplo tengamos el siguiente código en C (prueba2.c):

#include

void f(char *str)
{
char buff[16];
strcpy(buff, str);
}

void main()
{
char str[256];
memset(str, 'A', 255);
f(str);
}

En la función principal declaramos un buffer de 256 caracteres (bytes) llamado str al que rellenamos con 255 caracteres “A” (código ASCII 0x41) con la función memset(). Le pasamos este buffer a f() mediante su puntero. A su vez f() declara otro buffer buff de 16 caracteres y copia en él el contenido apuntado por el parámetro str mediante strcpy(). Evidentemente, 256 caracteres no caben en un buffer de 16, pero strcpy() no verifica los tamaños. ¿Qué ocurre entonces? Compilemos y ejecutemos:

[bash]$ gcc -g prueba2.c -o prueba2
prueba2.c: In function `main':
prueba2.c:11: warning: return type of `main' is not `int'
prueba2.c:16:2: warning: no newline at end of file
[bash]$ ./prueba2
Segmentation fault
[bash]$

¿Y qué nos dice el depurador? Utilicemos de paso las versiones abreviadas de los comandos:

[bash]$ gdb -q prueba2
(gdb) r [run]
Starting program: /home/m0s/Programacion/C%2fC++/prueba2

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) i r eip [info registers eip]
eip 0x41414141 0x41414141
(gdb)

Vemos que la dirección de retorno ha sido sustituída por 4 “A” (código ASCII 0x41), es decir, 0x41414141. Es decir, que al copiar las 255 “A” al buffer de 16 caracteres hemos desbordado el buffer y de paso arrasado la dirección de retorno guardada en la pila.

¿Podríamos de esta manera sobreescribir la dirección de retorno con la dirección de un código preparado por nosotros? Claro que sí. Pero tendréis que esperar a la próxima entrega :)

Comments

Popular Posts