Oye, ¿Donde está el password?

Vamos a cambiar la dinámica de las últimas entradas que han habido por aquí y vamos ha pegarle hoy ha algo mas técnico pero para el alcance de todo el mundo.

Vamos a entrar en la ingeniería inversa para ver que se pueden hacer cosas muy chulas, pero sin entender todo el proceso, para que la entrada en el mundillo sea mas apetecible....

Tenemos el siguiente programa que nos pregunta por un serial:

1

Este es el aspecto que tiene la aplicación, como veis algo muy sencillo, nos pide un password, si le metemos uno cualquiera...

2

Evidentemente nos dará que la contraseña es incorrecta, así que toca paso de abrir el debugguer para ver como podemos solventar este problema.

Abrimos OllyDebugguer y la aplicación que nos pide el password.

3

Si nunca has abierto Olly, tranquilo, no has de entenderlo todo, por no decir que muy poco, es un artículo de introducción.

Si os acordáis cuando metíamos el password nos daba un error y nos decía que era incorrecto...

Este mensaje es un string, así que lo que haremos será buscar todos los strings del binario.

4

Usamos la opción All references text strings.

Lo que nos saldrá será lo siguiente:

5

Ya tenemos todas las referencias a los strings dentro del binario. Ahora lo que haremos será ir a la dirección de memoria donde dice el mensaje de que se ha introducido un serial incorrecto.

Primera manera de aceptar el password

Una de las cosas que podemos hacer para que nos acepte el serial es modificar en memoria el binario para que nos acepte cualquier serial. Una vez modificado el binario podemos guardar el resultado para tener un binario parcheado, pero primero vamos a ver que instrucciones nos encontramos.

6

En la imagen podemos ver instrucciones como:

CALL: Llama/Salta a la dirección/función indicada

PUSH: Guarda el valor en la pila.

JMP: Salta a la dirección indicada.

Lo que vamos ha hacer nosotros es modificar la dirección de memoria 00401299. Aquí lo que hay es un JE que significa que cuando el programa llegue aquí saltará si es igual o si es cero.

Nosotros los cambiaremos por un JnE, que saltará si NO es igual o si no es cero. Esto lo que hará es que cualquier cosa que introduzcamos salte a que el serial es correcto. Hacemos Assemble con Olly en esa dirección de memoria.

En este caso tenemos dos soluciones posibles, colocar un JMP, que saltará hacia la parte de el serial es correcto, o un JnE que le pongamos lo que le pongamos dará OK también. A cada cual elija el que mas le guste.

9

Hacemos Assemble y corremos el programa con F9, metemos cualquier serial y...

10

Recordar que en ningún momento hemos modificado el binario, si queremos guardarnos una copia de lo que hemos modificado solo tendremos que hacer:

copy

Y seleccionamos Selection.

Segunda manera de sacar el password

Vamos a volver aquí:

6

Ahora lo que vamos ha hacer es meter un breakpoint (apretamos F2) en el CALL. Esto lo que hará es que el programa, parará su ejecución en ese CALL, la dirección de memoria en concreto es: 00401291.

Ejecutamos el programa y parará en el CALL donde hemos puesto el breakpoint, entonces apretamos F7 para entrar dentro del call y F8 para ir yendo instrucción a instrucción para que en la parte de registers de Olly nos acabe mostrando el password.

5

Y aquí hemos acabado.

Antes de que me lo diga algún lector, con un strings sacábamos el password que estaba harcodeado en el binario.

m0tNaF-EmKCARc
Check Status
Wrong Password! Keep trying, you'll get it!
You got it! Your now a cracker! 🙂

Espero que este artículo os anime a poneros con la ingeniería inversa / cracking, es un mundo fascinante.

Subir