El código fuente:

En este reto tengo el gusto de presentaros (si es que no lo conocíais) a la función strcpy.

 

Haciendo un 'man strcpy' se puede leer:

Esto significa que strcpy no controla el tamaño de variable cuando se le pase a buffer. Y esto se va a hacer realidad en el stack, dándonos la posibilidad de sobrescribir todo lo que haya por detrás. (Esto sí que es un masaje con final feliz!).

 

Este programa según vemos en el código va a hacer mas o menos lo siguiente:

 

1 - Comprobará si la la variable de entorno GREENIE contiene algo. Cerrándose si está vacía.

2 - Meterá un 0 en la variable modified.

3 - Pasará lo que haya en GREENIE a buffer.

4 - Si modified vale 0x0d0a0d0a habremos superado el reto.

 

Es un programa totalmente absurdo pero suficiente para observar el funcionamiento de strcpy().

 

Antes de verlo con radare voy a dar valor a GREENIE con 64 zetas:

Con un desensamblado del main...

....vemos que:

 

0x080484c8 - Copia el 0 de la variable modified en esp+0x58.

0x080484df  - Llamada a la función strcpy.

0x080484e4 - Copia el contenido (DWORD) de esp+0x58 en eax.

0x080484e8 - Compara eax con 0xd0a0d0a.

 

Ahora si pongo un 'break' en la 0x080484e4 y muestro el estado de la pila, vemos que se ha copiado el valor de GREENIE no llegando a sobrescribir esp+0x58 y por lo tanto:

"Try again, you got 0x00000000". Lógico puesto que todavía no hemos tocado el 0 que se pasó a esp+0x58. Pero ahora mismo vamos a terminar con esta agonia, ya que si en GREENIE metemos 64 caracteres + 0x0d0a0d0a, conseguiremos sobrescribir esp+0x58 y superar el reto (o eso dice el man strcpy xD):

 

Todo correcto Doctor, está usted sanísimo!