5.2.3. OllyDbg: Cracking de verificación de número de serie o registro
Serial Number cracking
En esta nueva práctica con OllyDbg el objetivo será superar otro mecanismo de seguridad basado en un número de serie o registro. En este tipo de esquemas de seguridad, se aplicarán algunas de las técnicas que ya se han visto en el ejercicio anterior de Cracking de contraseñas simple. Para ello, se puede descargar algún programa propuesto como reto en la web de CRACKMES.ONE, buscando por las palabras clave register o serial number. La práctica se basa en el ejecutable nag.exe. En este, se deben superar una serie de restricciones basados en el registro del software. Al abrir el programa, se puede comprobar mediante los campos Status y el botón Re-check si se ha conseguido superar estos mecanismos:
Nota: En inglés, “Nag not removed!” y “Please register…” indican claramente que el producto no está debidamente registrado y por lo tanto no se puede usar.
Los números de serie o métodos de registros son formas comunes utilizadas por los desarrolladores para controlar y restringir el acceso a las funciones completas o a una parte de ellas de un programa. Estos números suelen ser secuencias alfanuméricas únicas que el usuario debe introducir durante la instalación o la ejecución inicial del software para desbloquear ciertas características o para validar su licencia de uso. En este caso, no será necesario introducir ningún número, siendo el objetivo simplemente dar por registrado el programa mediante ingeniería inversa.
5.2.3.1. RGD Packer Detector: Sistemas de seguridad adicional
Además de los sistemas de seguridad provistos por contraseñas, registros e introducción de números de serie, algunos ejecutables con accesos restringidos pueden contener otras medidas de seguridad adicionales contra la ingeniería inversa. Existen determinados programas que permiten obtener información de la existencia o no de estas medidas, así como también sacar información sobre el lenguaje de programación del código fuente o la herramienta con la que se ha manipulado o compilado el ejecutable.
A modo de ejemplo, una de estas herramientas era RGD Packer Detector (32 bits). Actualmente la web original de este software ya no está vigente, por lo que es necesario recurrir a otras fuentes externas para encontrar alguna versión de este software. Una vez adquirida una copia, es recomendable desactivar temporalmente los sistemas de antivirus o malware del equipo, pues probablemente será detectado como un programa malicioso. Al capturar un programa ejecutable, este mostrará la información. Para los programas nag.exe y Crackme1.0 el resultado es el siguiente:
En estos dos ejemplos, el Nothing indica que no existen medidas adicionales de seguridad para evitar técnicas de ingeniería inversa. Además, proporciona información de las herramientas de compilación o lenguaje de programación empleados. Sin entrar en detalles, en el primer caso, MASM32 es un entorno de desarrollo integrado (IDE) específicamente diseñado para programar en lenguaje ensamblador para arquitecturas x86, como Intel o AMD, mientras que Free Pascal v2.0 es un compilador de código abierto que implementa el lenguaje de programación Pascal. Ambas herramientas ya están bastante en desuso.
5.2.3.2. Crackear programa nag.exe
A continuación se va a proceder a eludir el sistema de registro que impediría acceder a las funcionalidades del programa nag.exe. Los pasos a seguir, serán similares a los que se han explicado en el punto anterior para superar contraseñas simples, por lo que se recomienda explícitamente haber leído antes este punto. La técnica consiste en manipular directamente el código ensamblador del ejecutable:
Primero se busca la cadena de texto (string) en la parte del desemsamblador que indica que el programa debe registrase ([NAG] Please registrer …). Se puede observar los saltos hasta donde empieza el PUSH de la zona BAD BOY (004010A7 – 004010AE). En este caso interesa desde la dirección de memoria 0040108B que tiene un salto (JE):
Nota: En este caso, desde el salto (JE) a la dirección destino hay pocas instrucciones de diferencia. Si no fuera el caso, existe otra forma. Después de encontrar la cadena, otra forma para encontrar de donde proviene el salto, es situándose sobre el PUSH primero (004010A7) de la zona BAD BOY y hacer CTRL + R. Aparece la siguiente pantalla, haciendo doble clic el puntero se situará automáticamente en la parte del desensamblador donde está la instrucción del salto:
Para eludir los varios controles de seguridad, será necesario modificar el ejecutable al menos dos veces tal y como se indica en la parte de Status cuando está abierto y el aviso acerca del registro, compuesto por lo tanto de dos instrucciones. La primera será la que empieza por [NAG] y después [BULLSHIT].
La primera modificación para la instrucción que contiene la cadena [NAG]… consiste en modificar el operando JE para el salto por JNE (ver comportamiento FLAG Z), tal y como se vio en la práctica anterior.
Después de esta modificación, se guardan los cambios (práctica anterior). Al volver a ejecutar el programa no se va a producir el salto programado y el flujo seguiría su camino, pero indicando que todavía no se está registrado.
A continuación se procede con la segunda modificación, que es más complicada. Con el ejecutable ya modificado, se procede con los siguientes pasos:
1. Se realiza una búsqueda de strings por el nuevo texto indicado en el Status, con el objetivo de explorar el contenido del código y otras zonas de interés. Con ello se obtiene dos resultados, centrándose en el primero de ellos para empezar
2. Se observa que la dirección de la string indicada proviene de un salto. Sin embargo, entre este salto y la dirección de la string, hay dos saltos más. Lo que se hace para comprobar el comportamiento es añadir un breakpoint (BP) en estas tres instrucciones de salto:
3. A continuación se inicia el flujo de ejecución del programa con PLAY (F9), para ver el comportamiento tras detenerse en el primer BP (00401082):
4. Después de detenerse la ejecución con el primer BP, es el momento de aplicar la técnica de tracear sucesivamente (F8, F8) y así comprender la importancia de los saltos. Se observa lo siguiente:
- La dirección 0040108B que es el segundo BP debería llevar a la zona de BAD BOY que se está analizando.
- La dirección 00401094 que es el tercer BP debería llevarnos a la zona del GOOD BOY, según la flecha:
5. Tras varios F8 (tracear) para ver el flujo, es preciso en la dirección 00401094 forzar el salto a la zona GOOD BOY. Para ello se cambia en esta dirección la instrucción JE por su contraria (el tercer BP).
7. Con el programa en ejecución capturado por OllyDbg, tras aplicar este último cambio y darle a F9 (PLAY), se ve que haría correctamente el salto a la zona GOOD BOY, no obstante, si se le da a Re-Check, el mensaje de Status vuelve a indicar que no se ha terminado la tarea de saltar el registro.
Nota: En este punto, se recomienda guardar el ejecutable con esta última modificación y abrirlo de nuevo para acabar de parchearlo definitivamente.
Para completar el registro, se vuelve a buscar por cadenas. En este caso, era el del mensaje inicial: Nag not removed! Se puede observar que existe una segunda cadena con el mismo mensaje, así que en los siguientes puntos se va a abordar como evadir esta restricción:
1. Se observa que la instrucción indicada más arriba salta hacia esta zona de BADBOY, y que entre ambos registros también hay otras instrucciones de saltos que llevan a diferentes secciones:
2. Se aplican breakpoints a las tres instrucciones de salto y se inicia el programa (PLAY F9). En el programa en ejecución tras detenerse, se le da al botón de Re-check para ver el comportamiento.
3. Tras realizar el Re-Check, se sitúa en el primer salto. A partir de aquí se va traceando (F8) y se ve como en el 2º BP el flujo va a la dirección del “Nag not removed” y que siguiendo tampoco va a la sección de GOOD BOY:
4. Este comportamiento indica que hay que cambiar dos instrucciones de salto por su contrario, es decir, los dos últimos BP:
¡Ahora sí, con este último cambio se consigue eludir el sistema de registro de forma completa!