kd❯ g

fffff803'00000000 EB FE jmp short loc_HackinG

~ ./priv



Happy_Brithday.exe Binary Solution

Primero que todo quisiera agradecer a mi amigo @dplastico que me permitio aportar con un grano de arenas que fue este binario para la seccion de cracking.

Descargar binario Aquí (Pass: pwn) y Source

Description:
Este post sera bien breve ya que el binario no tomaba mucho tiempo en resolver. Ahora existían dos caminos para solucionar este reto uno lago y otro corto. El corto solo se necesitaba parchar el binario y obtener la flag y el largo se necesitaba analizar que hacia el binario en si. Ahora esto hace la diferencia entre un reverse y un competidor de ctf ya que el reverse aunque sabe como resolver rápidamente el reto, de igual manera quiere entender el flujo y se lleva todo el tiempo jeje.

Lo primero es ver que devuelve el binario cuando se ejecuta. Como resultado tenemos un "Try Harder..." entonces vamos a un nivel mas bajo.



Despues de cargar el binario en un interactive disassembler como IDA, observamos el main() del binario y algunas de sus condiciones. Otra cosa a mencionar es que este binario contiene múltiples funciones anti-debug.



Ahora pasamos a una pincelada de análisis, donde se observa la función flag1() que imprime el mensaje "Try Harder..." y que necesita un argumento para seguir con el flujo correcto.



Cuando seguimos con el flujo se nos da la condición de seguir por la función flag2() que tiene un flag falso o thetime(), todo depende si pasamos la comprobacion de IsDebuggerPresent().



Si hacemos el bypass correcto de las funciones IsDebuggerPresent(), thetime() y anti_debug() que todas estas nos envían a fuera por estar depurando, nos encontramos con el ultimo obstaculo un fs:30h ¿que es esto?. Bueno en resumidas cuando se llama a un FS:[0x30] estamos cargando una dirección de Thread Environment Block (TEB) a PEB con desplazamiento 68h a NtGlobalFlag.

Despues de evitar esto ultimo, entramos a la rutina para obtener el flag correcto.

Leer mas de TEB aquí.



Acá encontramos un array de caracteres que serán utilizados para generar el string final del flag. Estos son calculados de la siguiente manera:

- Toma los primeros byte de los array y los calcula 0x69^0x11=0x78
- El resultado es xoreado con 0x122 y así sucesivamente con cada resultado.

Despues al finalizar se realiza una lectura con size 0x29 en un for() donde es mayor al primer buffer[7], Entonces podemos leer todo los buffer que están por debajo.




Este es el algoritmo que calcula mediante XOR los caracteres entre si.



Video:
https://www.youtube.com/watch?v=gcJ1xUB0-wU