Hacemos lo que dije arriba para caer en la zona caliente xD y en 00450F0A hay un call, entramos en el y vemos que toma cada caracter del pass y lo compara con 51 si es menor salta y si es mayor a 5A salta también sumandole 0x20 para convertir de mayúscula a minúscula ej si pongo A se convierte a "a"... Y eso lo mueve a:021745EB aprox, en mi caso
aqui se ve claramente
Código: Seleccionar todo
00407D85 |> 8B0424 /MOV EAX,DWORD PTR SS:[ESP]
00407D88 |. 8A00 |MOV AL,BYTE PTR DS:[EAX]
00407D8A |. 3C 41 |CMP AL,41
00407D8C |. 72 06 |JB SHORT CrackMe_.00407D94
00407D8E |. 3C 5A |CMP AL,5A
00407D90 |. 77 02 |JA SHORT CrackMe_.00407D94
00407D92 |. 04 20 |ADD AL,20
00407D94 |> 8B5424 04 |MOV EDX,DWORD PTR SS:[ESP+4]
00407D98 |. 8802 |MOV BYTE PTR DS:[EDX],AL
00407D9A |. FF0424 |INC DWORD PTR SS:[ESP]
00407D9D |. FF4424 04 |INC DWORD PTR SS:[ESP+4]
00407DA1 |. 4B |DEC EBX
00407DA2 |. 85DB |TEST EBX,EBX
00407DA4 |.^75 DF \JNZ SHORT CrackMe_.00407D85
Salimos de ese call y seguimos traceando vemos mas abajo despues de pasar otro call, vemos uno que apunta a 451008 y que toma el user que se encripta en md5 y mas abajo dentro de el call convierte cada caracter del encriptado en su valor ascii
Código: Seleccionar todo
0045104D |> 8B45 EC /MOV EAX,DWORD PTR SS:[EBP-14]
00451050 |. 8A4418 FF |MOV AL,BYTE PTR DS:[EAX+EBX-1]
00451054 |. 25 FF000000 |AND EAX,0FF
00451059 |. 8945 E8 |MOV DWORD PTR SS:[EBP-18],EAX
Vemos arribita como mueve el valor asci del user en EBP-18 que en el debugger nos marca la dirección 18F540 que vendría siendo donde se guardan los valores ascii
en la misma rutina hace unas conversiones extrañas de tipo entero el valor hex de la letra a tipo flotante osea el hex lo pasa a ascii pero de tipo flotante no entero
aca lo vemos
Código: Seleccionar todo
0045105C |. DB45 E8 |FILD DWORD PTR SS:[EBP-18]
0045105F |. 83C4 F8 |ADD ESP,-8
00451062 |. DD1C24 |FSTP QWORD PTR SS:[ESP]
00451065 |. 9B |WAIT
00451066 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
00451069 |. E8 3234FBFF |CALL CrackMe_.004044A0
0045106E |. 8BD0 |MOV EDX,EAX
00451070 |. D1FA |SAR EDX,1
00451072 |. 79 03 |JNS SHORT CrackMe_.00451077
00451074 |. 83D2 00 |ADC EDX,0
00451077 |> 8BC6 |MOV EAX,ESI ; |
00451079 |. E8 8A000000 |CALL CrackMe_.00451108 ; \CrackMe_.00451108
0045107E |. DC45 F0 |FADD QWORD PTR SS:[EBP-10]
00451081 |. DD5D F0 |FSTP QWORD PTR SS:[EBP-10]
00451084 |. 9B |WAIT
00451085 |. 43 |INC EBX
00451086 |. 83FB 21 |CMP EBX,21
00451089 |.^75 C2 \JNZ SHORT CrackMe_.0045104D
Si no sabes bien lo que hacen las instrucciones la cosa es deducir, observa bien en los registros st0 st1 y st6,st7 y checa los números reales como van moviendose/sumando ahora mucho ojo hay unos call en la rutina el primero esta toma la longitud del usuario y la divide entre 2 y guarda ese resultado en edx, y ese resultado de la division es el número de veces que el número flotante se multiplicará por sí mismo, pero el segundo call si entras con f7 y miras la rutina se puede deducir que se multiplica el valor en dec por si mismo x veces (las veces las obtiene con el call anterior como dijimos) y luego se suma a lo que hay en 0018F548 en conclusión se van sumando ahí todos los números convertidos a su valor ascii multiplicados por si mismos len(md5(str))/2 veces y voilá ese sería el serial...