http://foro.elhacker.net/index.php/topic,180720.msg860578.html#msg860578
TUTE ‘Crackme04 de x4uth’ por karmany
Herramientas utilizadas: OllyDBG 1.10
INTRODUCCIÓN:
Viendo que nadie más se apunta a resolverlo, y porque se me está olvidando su solución pues creo conveniente realizar el tute de este fantástico CrackMe.
La verdad que el crackme no es que sea fácil, pero veremos cómo encontrarle puntos débiles que harán que todo sea mucho más sencillo.
Si analizamos el crackme con RDG Packer Detector, nos dice que no está empacado y que ha sido compilado con Microsoft Visual C++ 6.0. x4uth es un programador y cracker con experiencia así que podemos esperar muchas maldades.
TOMA DE CONTACTO:
Lo primero que voy a hacer es analizar el crackme y a escribir las cosas más importantes que veo:
1.- Después de examinarlo y ejecutarlo con el OllyDBG, observo que termina todo en un Exit Process. Así que cierro el OllyDBG y veo que el crackme se sigue ejecutando…
Ummm. En este punto mi lógica me dice que debe de haber algún proceso ejecutándose, así que simplemente pulso Ctrl+Alt+Supr y en procesos observo que se está ejecutando uno llamado: “Crackme04.exe”… ya te tengo…
2.- El crackme pide un UserName y un Keycode, así que yo voy a buscar la solución para UserName = “karmany”.
Si introduzco un nombre-serial inválido me saldrá una nag de:
-Título: “!!!!!!!!”
-Mensaje: “Invalid KeyCode”
3.- Curiosamente, si pulso la tecla “Enter” mientras tengo el cursor en cualquier TEdit veo que el crackme se cierra… ¡Vaya!
MANOS A LA OBRA:
Como he dicho en el punto 1, hay un proceso ejecutándose así que voy a atachearlo. Ejecuto directamente el “crackme04.exe” y posteriormente abro el OllyDBG y voy a: File --> Attach y selecciono el proceso “crackme04.exe”.
OllyDBG ya me avisa abajo: “Attached process paused at ntdll.DbgBreakPoint”.
Pulso F9 para que se ejecute correctamente ya debugeado. Como se puede uno imaginar.
MI FORMA DE ALCANZAR LA "ZONA CALIENTE":
Ahora muchas formas de continuar, así que cada uno que elija o pruebe la que más le guste. Mi idea es la siguiente para este crackme:
Voy a buscar la API con la que toma el UserName y el Keycode y siguiendo el código probablemente me lleve a la zona “caliente”.
Hay varias forma de tomar los datos de un TEdit, así que con el plugin “CommandBar” pongo varios Breakpoints y después de probar unas cuantas veces descubro que lo que interesa poner en la CommandBar es lo siguiente:
“BP GetWindowTextA”.
Pongo de nombre: “karmany” y de serial “1234567890”, pulso en Verificar y efectivamente se detiene el OllyDBG en GetWindowTextA pero para poder continuar hay que pulsar “Ctrl+Atl+Supr”. Paso la función y retorno seguidamente al código aquí:
407597 MOV ECX,DWORD PTR SS:[EBP+10], que es justo después de la llamada a GetWindowTextA.
Llego hasta el RET, lo paso con F7 y llego a:
4014F7 ADD ESI,7C
En este punto ya veo que las dos CALL que aparecen obtienen: una el nombre (4014F2 CALL 00407562) que es la que acabo de pasar y la otra el serial (401501 CALL 00407562) que es la que voy a pasar ahora.
Llego hasta el RET, lo paso, vuelvo a llegar hasta el siguiente RET lo vuelvo a pasar y ya por fin caigo en el código caliente en:
4016EF XOR EAX, EAX
Esta ha sido una forma sencilla de caer rápidamente en la zona que nos interesa.
La subrutina que hay que analizar por lo tanto:
Comienza en: 4016A0 PUSH EBP
Termina en: 402227 RETN
ANÁLISIS DE LA GRAN SUBRUTINA:
Para analizar esta gran subrutina hay que ir poco a poco entendiendo las trampas que nos ha hecho x4uth.
Tras analizarla detenidamente y traceando muchas veces por el código, podemos echar un vistazo al final y observar lo siguiente:
Ahí donde está el BP, tenemos el byte a 1 que nos registra.
Pero para que llegue a ejecutarse ese código x4uth nos ha puesto una serie de obstáculos que hay que saltar, ya que nos mandan después de MOV BYTE PTR SS:[EBP-1],1 y por lo tanto no estaremos registrados... son los JMP 004021FC
Yo en un primer momento intenté solucionarlo por Fuerza Bruta, que no voy a explicar aquí, pero me cansé de esperar tanto tiempo y ya que tenemos un buen debuger pues accedí a analizar todo el código...
Voy a estudiar los saltos:
Pongo de nombre: karmany
Pongo de serial: 12345678
401778 JE SHORT 00401793 Probando descubrí que salta cuando dejamos vacío el UserName. Así que ya sé: dejo de nombre "karmany"
401789 JE SHORT 00401793 Aún dejando el serial vacío no salta, así que como karmany no salta pues karmany me vale.
401791 JE SHORT 0040179D Tiene que saltar y salta, así que no me preocupa más.
4017C3 JE SHORT 004017CF Tiene que saltar. Se ve cómo toma los valores de mi nombre pero aún poniendo el serial vacío salta perfectamente. Sigo.
401B14 JE SHORT 00401B17 Hasta llegar aquí, ha realizado una barbaridad de operaciones, pero lo que me interesa es que hace un XOR EDX, EAX y una comparación CMP EDX, 17. Me detuve en el XOR EDX, EAX y observé el valor de los registros: EAX = 37 y EDX = 36. Ummm parece que son los valores ASCII de mis 2 penúltimas cifras!!! O sea que XOR EAX, EDX tiene que ser 17. hay muchas combinaciones. Yo puse varias pero cuando va trascurriendo el CrackMe te das cuenta que no vale así que para no alargar voy a poner la que descubrí al final: "+<":
+ = 2B
< = 3C
XOR 2B, 3C = 17
Queda un serial ahora: "12345+<8"
Ahora nos encontramos con 4 malignos saltos. No se tienen que cumplir porque nos mandan a un RET. Toca investigar.
1º Salto.
Si me pongo en la comparación en 401F19 veo que el dato es FFFFFFF5. Así que por probar voy a ir modificando valores de mi serial y observo que ese valor (FFFFFFF5) se modifica al variar la 2ª cifra. Si pongo de serial "10345+<8" el valor cambiará a FFFFFFF3. Se puede hacer a mano pero yo hice una sencilla Fuerza Bruta y me dió el siguiente resultado: "=" (símbolo igual)
Así que queda de serial: "1=345+<8"
2º Salto.
Esta vez veo que se modifica la 1ª cifra así que descubro esta vez que es la letra "R".
Serial: R=345+<8
3º Salto.
Corresponde a la 3ª letra. Encontré que podía ser la "O".
Serial: R=O45+<8
4º Salto.
Este salto me hizo modificar los valores del XOR EDX, EAX. Por eso los cambié. Lo hice por Fuerza Bruta. Recuerdo que paró enseguida.
401FF1 JE SHORT 00401FFD Se tiene que producir. Modificando la 4ª cifra cambiaba de valor, así que descubrí: ">".
Serial: R=O>5+<8
402026 JE SHORT 00402032 Se tiene que producir. Modifiqué la 5º cifra y descubrí un valor posible: "i"
Serial: R=O>i+<8 (sale con este serial una ventana curiosa jeje)
4020B0 JE SHORT 004020BC Tiene que saltar. Y salta.
4021F2 JE SHORT 004021F8 Por fín el último salto que nos registra. Se tiene que producir. Modifico la última cifra que queda y compruebo que salta con: "p".
Serial Final: R=O>i+<p
Voy a probar el serial a ver:
Espero que a alguien le pueda ayudar.
Seguro que se puede resolver de muchas otras formas.
Un saludo
karmany