5.2.2. OllyDbg: Cracking de contraseñas simple
5.2.2.1. Zonas GOD and BAD BOY, Breakpoint y técnica de tracear
En esta práctica se va a crackear un simple programa denominado Crackme1.0 que consiste en introducir una clave y comprobar que es la correcta. Si la contraseña es correcta, el flujo de ejecución dirige a una zona del código ensamblador denominada GOOD BOY, mientras que si es incorrecta, dirige a una zona denominada BAD BOY. La práctica consiste en redirigir en flujo de ejecución a la zona de GOOD BOY.
La secuencia sería la siguiente:
Una forma de obtener pistas al realizar ingeniería inversa, es obtener información de las cadenas de caracteres o literales que incluye el código. Este caso, para buscar por cadenas en OllyDbg se debe ubicar el cursor en la zona de desensamblaje y buscar por cadenas tal y como se indica en pantalla (botón secundario):
Search for >> All referenced strings
Entre las cadenas de texto se puede encontrar la que indica la zona BAD BOY, es decir, la que muestra cuando no se ha introducido correctamente la llave.
Al clicar encima de la línea BAD BOY, OllyDbg se situará en la parte del código ensamblador en donde se halla la referencia a la cadena con la instrucción. Además, en los alrededores de esta zona, también se puede obtener informar de otras zonas que a priori puede parecen interesantes. Serían, indicando la dirección de memoria:
(1) – 0040124F: Instrucción JNE para salto de dirección a la 00401267 (la de la BAD BOY), que decide a que zona va.
(2) – 00401258: Es la zona de CHICO BUENO.
(3) – 00401267: Aquí empieza la zona del CHICO MALO.
En este punto es importante destacar el funcionamiento del operando JNE o JNZ. Este salto se producirá en función de la FLAG Z que está en la sección de registros de OllyDbg. En concreto, el salto se produce si no es igual o la bandera Z no es cero.
Para ver el comportamiento del FLAG Z y si se produce o no el salto durante la ejecución del programa, lo que se hace es incorporar un BREAKPOINT (BP) en la instrucción del salto. Un breakpoint, como la traducción al inglés sugiere, es una marca o punto de interrupción en el flujo normal del programa, permitiendo observar con detenimiento el comportamiento de este. Para crear el BP, simplemente hay que seleccionar el registro del salto y pulsar F2, generando una marca entre esta instrucción y la del salto.
Ahora es el momento de analizar el flujo de ejecución y cómo se comporta la FLAG Z. Se pude iniciar la ejecución con PLAY (F9). Cuando aparezca el menú para introducir una contraseña, se introducirá cualquiera (sabiendo que será errónea).
Al introducir la contraseña mala, el BP hará su efecto y se podrá observar el comportamiento. En este caso, se observa que el programa ha dado un salto a la zona BAD BOY y que la FLAG en Z es 0, por lo que se deduce que salta a BAD BOY si Z=0 y no salta si Z=1.
Este análisis no es suficiente, pues con el BP solo se ha dicho a OllyDbg que se detuviera allí. Sin embargo, es necesario obtener información precisa de hacia dónde está yendo el flujo. Para ello se va a utilizar la técnica de tracear, que consisten en ver como se está ejecutando el programa línea a línea (instrucción a instrucción). Sin cerrar el programa en donde se había quedado (no pulsar la X de salida), se hace F8 (tracear) + F9 (play).
5.2.2.2. Crackear programa Crackme1.0
Ahora que se ha realizado en análisis del programa, es el momento de forzar el ejecutable (crackear) y que redirija automáticamente a la zona GOOD BOY no autorizada. Para ello se recomienda:
- Volver a cargar programa y limpiar el proceso que se haya creado en la carpeta donde está OllyDbg.
- Volver a hacer el BP en el salto (JNE), ejecutar (F9) y provoco el fallo.
- Ahora sí, sin salir de la ejecución del ejecutable, modificar manualmente la FLAG poniendo a 1 y volver a darle a PLAY (F9), apareciéndonos en la zona de GOOD BOY.
Una vez realizadas estas comprobaciones y análisis, se va a proceder a modificar el ejecutable. La clave está en el registro JNE (JNZ). Su contrario es la instrucción JE. De este modo se estará realizando la instrucción contrario para lo que estaba preparado el programa en su forma inicial. Para hacerlo:
1. Se hace doble clic sobre la instrucción del salto y se modifica como se indica:
2. La instrucción quedará marcada en rojo, indicando que se ha modificado. Ahora consiste en darle a PLAY (F9) para ver que está funcionando. Se recomienda hacer un nuevo breakpoint sobre la instrucción y combinar con el traceo (F9 + F8 + F9):
3. Para guardar las modificaciones se hace clic secundario sobre la instrucción modificada y se siguen los pasos mostrados en la imagen (Copy to executable):
4. En la pantalla que se muestra a continuación, se da al botón secundario encima de la pantalla y finalmente Save File:
5.2.2.3. Notas adicionales para Debugging
Volviendo al programa original, si se observa en las instrucciones que están por encima de la de salto (JNE) se tiene la siguiente información:
- La instrucción previa OR EAX, EAX indica la condición que se debe tener para saltar a o no a la zona BAD BOY. En concreto, si EAX = 0 (registro) entonces no salta y sigue el flujo a la zona de GOOD BOY, y si es diferente a 0 (EAX), entonces salta al BAD BOY.
- La instrucción de más arriba, CALL (…) es el proceso que se realiza para que EAX sea o no cero.
Para poder comprender mejor esta secuencia, se puede incorporar un breakpoint (F2) en la dirección con la instrucción CALL y después dar a PLAY. En este caso, puede verse como se intenta hacer la comparación y aplicarlo al registro EAX: