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