Introduccion a RSA – parte I
Hoy traigo un ejemplo practico para comenzar a meternos en los crypto challenges de RSA, documentacion sobra por todos lados pero esta media pobre. Con pobre me refiero a que son medios para gente muy avanzada que ya esta en el tema hace rato y no dan muchas pistas de como resolvieron tal o cual problema
Por cuestiones de espacio el tute fue dividido en dos partes, en esta trataremos el reverseo del programa, y en la segunda vamos a darle un poco a las matematicas con python para tratar de resolverlo
nuestro objetivo sera un crackme inocente que encontre en crackmes.de bajo el nombre de Ninja Crackme by Bart
esto no va a ser un tute sobre como resolverlo, sino que voy a dar algunos pantallazos para que me puedan seguir (no esperen que explique como poner un bp)
carita del crackme
para no dar muchas vueltas arranco el analisis desde la zona caliente (igual para caer ahi solo hace falta un bp en GetDlgItemTextA) y entrar en la siguiente funcion. Podemos ver que se le pasan como argumentos el nombre, serial y dos numeros hexadecimales en string
analicemoslo
el codigo no es nada dificil de seguir, en comentarios deje una interpretacion en pseudo-codigo para el que se pierde 🙂
esta parte es un poquito mas importante, ya esta poniendo filtros a nuestras entradas y nos esta diciendo como tienen que ser. En el caso del nombre son solo letras o espacios y el programa se encarga de hacerle un upper(), para el serial solo se admiten numeros del 0 al 9 y letras de la A a la F (un numero hexadecimal)
para reconocer las funciones MD5 hay varias formas, una es usar algun analizador criptografico como el que trae el RDG packer detector, o sino a mano traceando y viendo las changing variables (constantes usadas por MD5)
la funcion mr_compare tampoco aparecio a la primera con el pycommand que cree la vez pasada, esto se debe a que no tiene un numero magico asignado (no se porque), pero analizando las instrucciones y viendo despues el codigo fuente de miracl, salta facil de que funcion se trata. Pego aqui la funcion
PUSH R32 MOV R32,DWORD PTR SS:[ESP+C] PUSH R32 MOV EBP,DWORD PTR SS:[ESP+C] PUSH R32 CMP EBP,R32 PUSH R32 JCC MOV R32,DWORD PTR SS:[EBP] MOV R32,DWORD PTR DS:[R32] MOV R32,R32 MOV R32,R32 AND R32,80000000 AND R32,80000000 MOV R32,R32 NEG R32 SBB R32,R32 AND R8,0FE INC R32 CMP R32,R32 JCC AND R32,7FFFFFFF AND R32,7FFFFFFF CMP R32,R32 JCC JCC POP R32 POP R32 POP R32 POP R32 NEG R32 RETN TEST R32,R32 JCC LEA R32,DWORD PTR DS:[R32+R32*4] SUB EBP,R32 MOV R32,DWORD PTR DS:[R32+EBP] MOV R32,DWORD PTR DS:[R32] CMP R32,R32 JCC JCC DEC R32 SUB R32,4 TEST R32,R32 JCC XOR R32,R32 POP R32 POP R32 POP R32 POP R32 RETN
las lineas que le marque son las que yo usaria para buscarla, (Search For–>Sequence of commands). Si aparece y ven que solo usa 3 argumentos, entonces estamos casi en condiciones de afirmar que se trata de mr_compare
veamos todo juntito para ver como queda el cuento
ahi lo vemos tranquilos, compara el md5 del nombre con el serial encriptado con RSA
Hasta aqui llego mi amor el dia de hoy, en la proxima entrega vamos a tener un par de formulitas dando vueltas para obtener nuestro serial y poder keygenerarlo
Hey! seguis con la onda! muy divertido el crackme! 🙂
con poco tiempo y varios bardos, pero siempre haciendome un tiempito para jugar 😉