martes, 2 de diciembre de 2014

Análisis Técnico de un Sistema de Protección basado en KEYFILE - PARTE 3

Análisis Técnico de un Sistema de Protección basado en KEYFILE - PARTE 3






Una vez desensamblado el ejecutable vamos y damos click en el botón: 




para que nos muestre los String references que contiene y vemos la siguiente ventana:







Donde Donde podemos ver los textos que muestra al llevar a cabo una acción y si ustedes son
muy avivados podemos darnos cuenta de algo súper importante, recuerdan que
habíamos dicho en líneas anteriores que el crackme buscaba un archivo? Y no lo
encontraba? Bueno pues ahí nos podemos dar cuenta que archivo busca:



Abex.l2c


Ya vieron que fácil fue encontrar el nombre del archivo que busca para saber si esta registrado? Ok ahora creemos un archivo con ese nombre en el folder donde tenemos el crackme:




 

Lógicamente este lo creamos en primera instancia con el Block de notas, una vez hecho esto, ejecutamos el crackme y vemos que mensajes nos manda ahora:




Ok perfecto como vemos ya no dice que no encuentra ninguna keyfile, ahora dice que el archivo encontrado cumple con el nombre mas no con el contenido, ya dimos el primer paso, lo siguiente es ahora abrirlo el ejecutable con el debugger llamado OllyDBG el cual nos mostrara en código desensamblado la información:
 
 
 
Ya lo tenemos abierto en el debugger, el siguiente paso es dar clic con botón derecho y seleccionar la opción Serarch for  All reference strings y aparece esto:
 
 
 
 
Donde sin más palabras podemos ver lo mismo que en el W32dasm los strings
references que contiene el ejecutable, ahora demos doble click sobre abex.l2c y
veamos a donde nos lleva:

 
Aquí claramente podemos ver todo el código que se encarga de decidir si es válido o no el KEYFILE en la dirección de memoria: veamos el código desensamblado para entenderle mejor 2 cabe señalar que resaltare las líneas más importantes en color rojo con mis comentarios:

00401025 |. 68 B9204000 PUSH PoC-21.004020B ; |FileName = "abex.l2c" \\ aquí pone en memoria el nombre del archivo\
0040102A |. E8 5E000000 CALL <JMP.&KERNEL32.CreateFileA> ; \CreateFileA \\ en este apartado usa una api de Windows
específicamente la de la librearía KERNEL32 llamada CreateFIleA \\

0040102F |. A3 CA204000 MOV DWORD PTR DS:[4020CA],EAX
00401034 |. 83F8 FF CMP EAX,-1 \\ compara el registro EXA con -1 \\
00401037 |. 74 3C JE SHORT PoC-21.00401075 \\ si es igual salta a la dirección de memoria 401075 \\
00401039 |. 6A 00 PUSH 0 ; /pFileSizeHigh = NULL
0040103B |. FF35 CA204000 PUSH DWORD PTR DS:[4020CA] ; |hFile = NULL
00401041 |. E8 4D000000 CALL <JMP.&KERNEL32.GetFileSize> ; \GetFileSize \\ toma el tamaño del archivo\\
00401046 |. 83F8 12 CMP EAX,12 \\ compara el registro EAX con 12 \\
00401049 |. 75 15 JNZ SHORT PoC-21.00401060 \\ hace un salto condicional JNZ (salta si no es cero) a la dirección de memoria 401060 \\
0040104B |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040104D |. 68 35204000 PUSH PoC-21.00402035 ; |Title = "Well done!" \\ empuja el string a memoria \\
00401052 |. 68 40204000 PUSH PoC-21.00402040 ; |Text = "Yep, keyfile found!" \\ empuja el string a memoria \\
00401057 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401059 |. E8 41000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA \\ aquí hace uso de la librería USER32.DLL para mostrar pun mensaje por medio de la API MessageBoxA \\
0040105E |. EB 28 JMP SHORT PoC-21.00401088 \\ y termina la ejecución \\
00401060 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401062 |. 68 79204000 PUSH PoC-21.00402079 ; |Title = "Error"
\\ empuja el string a memoria \\
00401067 |. 68 7F204000 PUSH PoC-21.0040207F ; |Text = "The found file is not a valid keyfile!" \\ empuja el string a memoria \\
0040106C |. 6A 00 PUSH 0 ; |hOwner = NULL
0040106E |. E8 2C000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
\\ aquí hace uso de la librería USER32.DLL para mostrar pun mensaje por medio de la API MessageBoxA \\
00401073 |. EB 13 JMP SHORT PoC-21.00401088 \\ y termina la ejecución \\
00401075 |> 6A 00 PUSH 0 ; |/Style = MB_OK|MB_APPLMODAL
00401077 |. 68 54204000 PUSH PoC-21.00402054 ; ||Title = "Error" \\ empuja el string a memoria que será el titulo de la ventana que contendrá la siguiente línea de string\\
0040107C |. 68 5A204000 PUSH PoC-21.0040205ª ; ||Text = "Hmmmmm, I can't find the file!" \\ empuja el string a memoria \\
00401081 |. 6A 00 PUSH 0 ; ||hOwner = NULL
00401083 |. E8 17000000 CALL <JMP.&USER32.MessageBoxA> ; |\MessageBoxA \\ aquí hace uso de la librería USER32.DLL para mostrar un mensaje por medio de la API MessageBoxA \\
00401088 \> E8 0C000000 CALL <JMP.&KERNEL32.ExitProcess> ; \ExitProcess \\ termina la ejecución \\
0040108D $- FF25 54304000 JMP DWORD PTR DS:[<&KERNEL32.CreateFileA>] ; kernel32.CreateFileA
00401093 $- FF25 58304000 JMP DWORD PTR DS:[<&KERNEL32.GetFileSize>] ; kernel32.GetFileSize
00401099 .- FF25 5C304000 JMP DWORD PTR DS:[<&KERNEL32.ExitProcess>] ; kernel32.ExitProcess
0040109F $- FF25 64304000 JMP DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA

**********************************************************

Ok con esto creo que tenemos todo claro para finalizar este análisis hagamos una unión de lo que hace el CRackme:

1. busca si existe el archivo: abex.l2c
2. si lo encuentra verifica el contenido.
3. Compara el contenido del KEYFILE con 12h de error usand
4. Si el contenido no es lo que necesita manda un mensaje o las Apis del sistema operativo.
5. si es lo que necesita te registra y te manda el mensaje de chico bueno.

Ese es el proceso que necesita para validarlo, pero nos encontramos con un problema cuando lo compara con 12h que canijos es esto? Bueno pues muy fácil lo resolveremos con la calculadora de WINDOWS, si están leyendo bien amigos, CON LA CALCULADORA DE WINDOWS resolveremos este dilema del contenido que necesita el KEYFILE Para ser válido.

Vamos y abrimos la calculadora, la pasamos a formato científico y seleccionamos el formato Hexadecimal de la misma y ponemos lo siguiente:


 
 
Una vez hecho esto simplemente seleccionamos el formato DEC para pasar ese mismo valor hexadecimal a valores decimales y veamos que nos dice:




NoS podemos dar cuenta que el valor 12h tiene un valor 18 en decimal, mmmm
entonces lo que tenemos que hacer según el código que vemos del crackme es crear un archivo con el nombre de abex.l2c e incluirle dieciocho valores entonces se me ocurre poner:

Chilitom3x ccat201

Guardamos el archivo y …..

No hay comentarios:

Publicar un comentario

Crowdstrike -> Solución de errores de actualización de CrowdStrike con BitLocker habilitado

En este pequeño articulo ver como componer el problema de CROWDSTRIKE cuando esta habilitado el BITLOCKER, cabe resaltar que puede ser una e...