El código fuente:

Parece que se nos va a pedir un valor por teclado, va a comprobarlo y si es distinto de cero habremos superado el reto. Lo que ocurre es que, después de introducir este valor, el programa se lo va a machacar y lo va a sustituir con un cero. ¿Entonces? vamos a ver esto con radare2:

Podemos ver como la instrucción 0x08048417 va a ser la encargada de decidir si pasamos o no el reto.
 
Vamos a analizar las siguientes instrucciones:


0x08048411 - Mueve a eax el valor que hay en esp + 0x5c.
0x08048415 - 'test eax, eax' Va a activar la flag Zero si eax es un 0.

0x08048417 - je (salta SOLO si la Flag Zero está activada). Y por lo tanto:
    - Si ZF = 1. (eax valió 0 en 0x08048415):
        Salta a 0x08048427 -  ("Try again?")

    - Si ZF = 0.(eax valió !=0 en 0x08048415):
        Continua en 0x08048419 - ("you have changed the modified variable")

 

Sencillo no? Podemos deducir por el código fuente que en esp+0x5c va a haber un cero como una casa.
 
Vamos a hacer un punto de ruptura en 0x08048411 y vamos a comprobar esto:

Tal y como habíamos predicho. Y lo siguiente que nos preguntamos es, ¿Podríamos sobrescribir este valor? pues seguramente si (de eso va el reto). Aun así vamos a comprobar si el programa controla esto:

 

Pues ya está. Tan fácil como sobrepasar el buffer reservado (64) y sobrescribir la variable modified.
 
Esto ya está resuelto (aunque con un bonito "Segmentation fault"). Pero vamos a verlo con radare para que quede mas claro. Voy a darle 64 "zetas" y vamos a mirar el estado del stack:

Vale, "try again" con 64 zetas. Vemos que justo nos hemos quedado a punto de sobrescribir esp+0x5c que es lo que se pasará a eax para comprobar si es igual a cero.
 
Entonces si le pasamos 65 caracteres....

 

Reto superado!! y sin romper nada.