By FinalBoss - IPN CIC
Download Love here
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.
Sin embargo
al insertar una letra se queda en un bucle.
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.
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:
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:
Finalmente
se obtiene la bandera: flag{mad_love} como
se pensaba, como se muestra en la Figura 11
Comments
Post a Comment