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.
Esta página web ha sido creada con Jimdo. ¡Regístrate ahora gratis en https://es.jimdo.com!