1)Abrimos el programa con Rabin2 y sacamos información tanto del binario como de si hay alguna string interesante...
3)Abrimos el programa con Radare2 en modo Debug "r2 -d serial" y seguidamente analizamos el programa y vemos las funciones del binario con "aa" y luego "afl".
4)Luego nos vamos a la función mas interesante (main) para ello ejecutamos el comando en la shell de Radare2 el comando "s main" que lo que hace es irnos a la función main, y posteriormente desensamblamos esa parte de código de alguna de las siguientes maneras:
- "pd @ sym.main" .
- Nos vamos a la parte visual con "V" y con la letra "p" hasta llegar a la siguiente parte visual del desensamblado.
Vemos que hay una llamada de strlen() , y luego vemos una comprobación de la salida de la función con 0x10 (16 en decimal).
Por lo tanto ponemos un breakpoint en esa instrucción "db 0x00400a23" y ejecutamos el programa e introducimos una entrada de test "AaeE12" para ver sobre que input hace el strlen() (aunque no hay que ser un genio para imaginarlo...)
Luego nos vamos a la vista de debugger con el comando "V" en la shell de Radare2 y luego con "p" nos vamos cambiando hasta alcanzar la vista de debugger.
Luego ya podemos usar los shortcuts típicos de debugging como F7 (Step into) y F8(Step over).
En la vista de debugging podemos ver que tenemos la función Strlen() y en el stack el serial de test ("AaeE12") que hemos introducido. Tras la ejecución de Strlen() vemos que en el registro rax el valor es 6 que es el número de caracteres de la cadena de test que hemos introducido y en el caso de que no sea 16. No tomaría el primer salto condicional e iríamos a parar a la dirección 0x400a30, donde se mostraría el mensaje de serial no valido (el cual queremos evitar).
Por lo tanto deducimos que debemos introducir un serial de tamaño 16, tras esta primera condición, vamos a ver el resto de condiciones que debe de cumplir nuestro serial para ser válido. Si nos vamos mas abajo, vemos que:
- Comprobación 1Vemos que la primera letra del serial tiene que ser igual a "E"
Luego nos vemos que hay una comprobación que la suma de "E" en hexadecimal (0x45) junto con la última letra del serial tiene que ser igual a 0x9B --> por lo tanto la última letra será "V" (0x56).
Este tipo de comprobación se mantiene para las 4 primeras letras y por lo tanto tambien las 4 últimas, obteniendo los primero 8 caracteres del serial correcto: EZ9d????????7bAV - Comprobación 2
Esta comprobación es bastante parecida a la primera, la 5º letra la sacamos directamente de una comprobación en hexadecimal con la letra "m"(0x6d) pero en este caso la suma tiene que ser igual a 0xB4.
Por lo tanto la 5º letra por el final sera igual a 0xB4 - 0x6D --> "G" (0x47)
Update serial --> EZ9dm??????G7bAV - Comprobación 3
El mismo caso que las comprobaciones anteriores, aunque las suma es un valor distinto 0xAA, por lo tanto obtenemos las letras "q" de comparación directa y "9" de la resta de 0xAA - 0x71
Update serial --> EZ9dmq????9G7bAV
Obteniendo finalmente el serial --> EZ9dmq4c8g9G7bAV y comprobando que ese es el serial correcto al ejecutar el programa.
Comentarios
Publicar un comentario