HackDef 2017 Quals Round - Reversing 200

By FinalBoss - IPN CIC

Download Love here


Para iniciar se verifica el tipo de archivo haciendo uso del comando file como se muestra en la Figura 1.

Figura 1. Verificación tipo de archivo con comando file


Se hace un revisión de las cadenas legibles y se encuentra en particular una de nombre get_flag, como se muestra en la Figura 2.

  Figura 2. Cadenas legibles en el binario

Al realizar la ejecución del binario como se muestra en la Figura 3 y 4, se aprecia que si recibe un digito continua leyendo de consola.


Figura 3. Ejecución del binario con entrada que contiene dígitos

Sin embargo al insertar una letra se queda en un bucle.

Figura 4. Entrada en el binario con letras


 
Se procede a trabajar con el debugger y se desensambla la función main como se muestra en la Figura 5.
Se puede apreciar que no se manda a llamar a ninguna función de nombre get_flag que es interesante conocer si existe o simplemente era una cadena en el binario sin algo en especial.

  Figura 5. Desensamblado de la función main del binario 

Para comenzar con la ejecución del binario se pone un break en la función printf y para probar si existe una función de nombre get_flag se le pone un break también, teniendo un resultado positivo como se muestra en la Figura 6. Una vez puestos los breakpoints se inicia la ejecución.
Figura 6. Breakpoints en printf y get_flag

Una vez que se detuvo la ejecución en el primer breakpoint vamos intentar saltar a la función get_flag y como ya existe un breakpoint no entrará y saldrá sin darnos tiempo de analizarla. Para hacer una llamada a una función o dirección usamos call en el debugger como se muestra en la Figura 7.
 

Figura 7. Saltando a la función get_flag

Dicha función arroja como resultado la cadena amvdefgole{}_, lo cual contiene letras que podrian formar el resultado esperado, e.g. "flag{}", por lo que se procede de nuevo a analizar la funcion get_flag pero esta vez paso a paso con el objetivo de entender como se va calculando cada letra, en la Figura 8 se puede ver que la primer letra con valor "f" se ha cargado en el registro RAX (mismo que es comúnmente usado para almacenar el valor de retorno de una función).
  Figura 8. Obteniendo la primer letra de la bandera
En el siguiente round de la funcion, se observa que ahora se carga la letra "l" en RAX:

Figura 9. Obteniendo la siguiente letra de la bandera

En la figura 10, podemos ver el contenido del buffer con la cadena que se va generando, en este caso "fl", lo cual nos da la certeza que la bandera viene en camino:

Figura 10. Obteniendo la bandera paso a paso

Finalmente se obtiene la bandera: flag{mad_love} como se pensaba, como se muestra en la Figura 11

Figura 11. Obteniendo el flag del análisis de la pila durante la ejecución de get_flag

 

Comments