RSA crackme v1.0
by TSC
Tutorial de Lucifer48 [Immortal Descendants]
(5 Février 2000)
J'avais promis à TSC de jeter un coup d'oeil dessus, donc allons y. C'est ecrit en VC++, comme nous l'indique la jolie
icone MFC (M comme Micr...). Il n'y a rien de difficile, pas d'anti debugging tricks ou autres trucs méchants.
C'est juste du RSA (24). A ce propos, je considère que vous savez (un peu) ce que c'est ! TSC a d'ailleurs rassemblé
et traduit plusieurs articles (choix des clefs, ...) sur le sujet.
J'ai utilisé le logiciel Mathematica (une
merveille...) pour faire les calculs (le RSA24 se casse en moins d'une seconde).
J'entre mon nom et un dummy serial. bpx hmemcpy (l'un des derniers ?) et j'appuie sur le boutton "CHECK !".
XXXX:0040285B LEA EAX, [ESP+24]
XXXX:0040285F PUSH 0F ;14 char max + l'octet null de fin de chaîne
XXXX:00402861 MOV [ESP+0C], ECX
XXXX:00402865 PUSH EAX ;le serial va etre stocke à cette adresse
XXXX:00402866 PUSH 000003EB ;control-ID de l'EditBox du serial
XXXX:0040286B MOV ECX, EBX
XXXX:0040286D MOV [ESP+18], EDX
XXXX:00402871 CALL 004137E8 ;lecture du serial (appel à USER32!GetDlgItemTextA)
XXXX:00402876 LEA ECX, [ESP+24] ;mon serial
XXXX:0040287A PUSH ECX
XXXX:0040287B MOV ECX, EBX
XXXX:0040287D CALL 004029B0 ;verification du serial (important !)
XXXX:00402882 TEST EAX, EAX
XXXX:00402884 JZ 00402912 ;jump = mauvais serial
La clef est donc dans le call 004029B0. La première partie de ce call est peu importante, le crackme déplace des
nombres vers le segment .data via le call 00401130. Il y a quatre nombres:
9901 (e,n): clef publique
12790891 n
8483678
5666933
On verra ca plus tard, on continue la trace.
XXXX:00402A29 MOV EDX, [ESP+00000668] ;mon serial
...
XXXX:00402A41 REPNZ SCASB
XXXX:00402A43 NOT ECX
XXXX:00402A45 DEC ECX ;calcule la taille de mon serial (schéma très classique)
XXXX:00402A46 CMP ECX, 0E ;doit comporter 14 caractères
XXXX:00402A49 JNZ 00402BB2
Juste après on verifie que le serial est bien composé exclusivement de chiffres.
XXXX:00402AB2 CALL 00401130 ;déplacement memoire des 7 premiers chiffres de mon serial.
XXXX:00402AB7 LEA EDX, [ESP+18]
XXXX:00402ABB LEA EAX, [ESP+000000E0]
XXXX:00402AC2 PUSH EDX ;12790891
XXXX:00402AC3 LEA ECX, [ESP+00000404]
XXXX:00402ACA PUSH EAX ;9901
XXXX:00402ACB PUSH ECX ;résultat du calcul
XXXX:00402ACC LEA ECX, [ESP+0000059C]
XXXX:00402AD3 MOV BYTE PTR [ESP+0000066C], 04
XXXX:00402ADB CALL 00402310 ;calcul (d eax, après appel pour voir le résultat)
La deuxieme partie du serial subit le même sort. C'est assez facile de deviner, ce que calcule le call 00402310:
r1 = x1^9901 [12790891]
r2 = x2^9901 [12790891]
(x1: 7 premiers chiffres du serial ; x2: 7 derniers chiffres du serial)
Voilà la comparaison:
XXXX:00402B22 LEA EAX, [ESP+00000270] ;8483678
XXXX:00402B29 LEA ECX, [ESP+00000400] ;r1
XXXX:00402B30 PUSH EAX
XXXX:00402B31 MOV BYTE PTR [ESP+00000664], 07
XXXX:00402B39 CALL 00401DC0 ;strcmp (renvoie 0 si les deux chaînes sont identiques)
XXXX:00402B3E TEST EAX, EAX
XXXX:00402B40 JZ 00402C05
XXXX:00402B46 LEA ECX, [ESP+000001A8] ;5666933
XXXX:00402B4D PUSH ECX
XXXX:00402B4E LEA ECX, [ESP+000004CC] ;r2
XXXX:00402B55 CALL 00401DC0 ;comparaison
XXXX:00402B5A TEST EAX, EAX
XXXX:00402B5C JZ 00402C05 ;jump si eax==0
On cherche donc: r1 = 8483678 ou r2 = 5666933. Résolution du probleme:
In[1]:=
FactorInteger[12790891] ;n
Out[1]=
{{1667, 1}, {7673, 1}} ;n = p * q
In[2]:=
(1667-1)*(7673-1)
Out[2]=
12781552 ;(p-1)*(q-1)
In[3]:=
PowerMod[9901, -1, 12781552] ;e = 9901
Out[3]=
10961333 ;d = 10961333, (d,n) est la clef privée
Et donc, pour en revenir au crackme:
x1 = r1^10961333 [12790891]
x2 = r2^10961333 [12790891]
x1 = 8483678^10961333 [12790891]
x2 = 5666933^10961333 [12790891]
Finalement, on obtient:
In[4]:=
PowerMod[8483678, 10961333, 12790891]
Out[4]=
7167622 ;voilà x1
In[5]:=
PowerMod[5666933, 10961333, 12790891]
Out[3]=
3196885 ;voilà x2
Name/ N'importe quoi
Serial/ 7167622*******
Serial/ *******3196885
(* est un chiffre)
Dernière chose: y'a juste une dialogue box (bizarre) dans les ressources... c'est normal ?
Greetings: vous...
(c) Lucifer48. All rights reserved & reversed