___           ___           ___           ___           ___           ___     
     /\  \         /\__\         /\  \         /\__\         /\  \         /\  \    
     \:\  \       /:/  /        /::\  \       /::|  |       /::\  \       /::\  \   
      \:\  \     /:/__/        /:/\:\  \     /:|:|  |      /:/\:\  \     /:/\ \  \  
      /::\  \   /::\  \ ___   /:/  \:\  \   /:/|:|__|__   /::\~\:\  \   _\:\~\ \  \ 
     /:/\:\__\ /:/\:\  /\__\ /:/__/ \:\__\ /:/ |::::\__\ /:/\:\ \:\__\ /\ \:\ \ \__\
    /:/  \/__/ \/__\:\/:/  / \:\  \ /:/  / \/__/~~/:/  / \/__\:\/:/  / \:\ \:\ \/__/
   /:/  /           \::/  /   \:\  /:/  /        /:/  /       \::/  /   \:\ \:\__\  
   \/__/            /:/  /     \:\/:/  /        /:/  /        /:/  /     \:\/:/  /  
                   /:/  /       \::/  /        /:/  /        /:/  /       \::/  /   
                   \/__/         \/__/         \/__/         \/__/         \/__/    
				   .openmod.org


Keygenme - KITO level2




-|- A. Introduction


Au programme, le keygenMe de mr KITO, noté level 2.

action.


-|- B. silver's crack n-gen crackme 1

----------------------------------------------------------------------------------------

crackme author : KITO 
type : Name / Serial / Keygen
level : 2

----------------------------------------------------------------------------------------

Comme a l'habitude, on analyse toujours avec PEiD l'executable, pour etre a peut pret sure
qu'il ne soit pas packé ou crypté auparavant.

PEiD : MingWin32 GCC 3.x [Overlay]

MINGWIN32 un autre portage de GCC pour Windows.



Reversing :
-----------

Ce crackme se presente sous une forme 'prompt', j'entends pas là, qu'il n'y a pas d'interface
GUI.

Enter Your Name : thomas
Serial : 123456
Sorry.. More work to do!

Bon, on degaine olly, et on va regarder ça de plus pret :
Search for all referenced text string, et vois un GOOD WORK.

004019B1  |.  3B45 B4       CMP EAX,DWORD PTR SS:[EBP-4C]
004019B4  |.  75 36         JNZ SHORT 004019EC
004019B6  |.  C74424 04 F61>MOV DWORD PTR SS:[ESP+4],004016F6        ;  ASCII 0A," Good Work"
004019BE  |.  C70424 B07543>MOV DWORD PTR SS:[ESP],004375B0
004019C5  |.  E8 A6080300   CALL 00432270
004019CA  |.  C74424 04 101>MOV DWORD PTR SS:[ESP+4],00401710        ;  ASCII "Now, u should keygen this and write an tutorial",LF
004019D2  |.  C70424 B07543>MOV DWORD PTR SS:[ESP],004375B0
004019D9  |.  E8 92080300   CALL 00432270
004019DE  |.  E8 4DCB0000   CALL                 ; [_getch
004019E3  |.  C745 A4 00000>MOV DWORD PTR SS:[EBP-5C],0
004019EA  |.  EB 20         JMP SHORT 00401A0C
004019EC  |>  C74424 04 411>MOV DWORD PTR SS:[ESP+4],00401741        ;  ASCII 0A,"Sorry.. mo"

Bon, explications : 

en 004019B1, il compare, eax au stack, et jump si serial pas bon.
Je pose donc un bpx dessus, et op il break :

olly m'indique que la valeur du stack est : 

Stack SS:[0022FF34]=00070E40
EAX=0001E240

notre serial est donc : 70E40 (c'est de l'hexa) ce ki nous donne en decimal : 462400
Good, on a trouver le serial. Reste le plus sympa a faire, comment il a fait pour etre 
generé.

la routine de calcul du serial se trouve plus haut : 

00401952  |.  C74424 04 DB1>MOV DWORD PTR SS:[ESP+4],004016DB        ;  ASCII "Must be atleast 5 chars..."
0040195A  |.  C70424 B07543>MOV DWORD PTR SS:[ESP],004375B0          ;  ASCII "lbC"
00401961  |.  E8 0A090300   CALL 00432270
00401966  |.  E8 C5CB0000   CALL                 ; [_getch
0040196B  |.  C745 A4 00000>MOV DWORD PTR SS:[EBP-5C],0
00401972  |.  E9 95000000   JMP 00401A0C
00401977  |>  C745 A8 00000>MOV DWORD PTR SS:[EBP-58],0

rien de compliquer il verifie si le nom a bien au moins 5 caracteres

ensuite :

0040197E  |>  8B45 A8       /MOV EAX,DWORD PTR SS:[EBP-58]
00401981  |.  3B45 AC       |CMP EAX,DWORD PTR SS:[EBP-54]
00401984  |.  7E 02         |JLE SHORT 00401988
00401986  |.  EB 1C         |JMP SHORT 004019A4
00401988  |>  8D45 F8       |LEA EAX,DWORD PTR SS:[EBP-8]
0040198B  |.  0345 A8       |ADD EAX,DWORD PTR SS:[EBP-58]
0040198E  |.  83E8 40       |SUB EAX,40
00401991  |.  0FBE00        |MOVSX EAX,BYTE PTR DS:[EAX]
00401994  |.  0345 B4       |ADD EAX,DWORD PTR SS:[EBP-4C]
00401997  |.  83C0 04       |ADD EAX,4
0040199A  |.  8945 B4       |MOV DWORD PTR SS:[EBP-4C],EAX
0040199D  |.  8D45 A8       |LEA EAX,DWORD PTR SS:[EBP-58]
004019A0  |.  FF00          |INC DWORD PTR DS:[EAX]
004019A2  |.^ EB DA         \JMP SHORT 0040197E

- met la valeur d'EAX (le nombre de caractere = 6 pour 'thomas') dans le stack
- compare la stack a EAX
- prend le saut, si inferieur ou egal
- en 00401991, il prend la peremiere lettre de thomas = 74 et la met dans EAX
- en 00401997 il ajoute 4 a EAX
- en 004019A2 jump pour la lettre suivante 

ce qui donne pour H (68) + 78 = E0 +4

voici donc pour l'ensemble de nom prenom : 

t=74+4
h=78+68=E0+4
o=E4+6F=153+4
m=157+6D=1C4+4
a=1C8+61=229+4
s=22D+73=2A0+4

Vu qu'il y a un JLE en 00401984, il refait un tour :

2A4+4=2A8 = EAX

Ensuite :

004019A4  |> \8B45 B4       MOV EAX,DWORD PTR SS:[EBP-4C]
004019A7  |.  0FAF45 B4     IMUL EAX,DWORD PTR SS:[EBP-4C]
004019AB  |.  8945 B4       MOV DWORD PTR SS:[EBP-4C],EAX
004019AE  |.  8B45 B0       MOV EAX,DWORD PTR SS:[EBP-50]
004019B1  |.  3B45 B4       CMP EAX,DWORD PTR SS:[EBP-4C]
004019B4  |.  75 36         JNZ SHORT 004019EC

En 004019A7 il multiplie EAX par lui meme.

ce qui nous donne 2A8 * 2A8= 70E40 !!! :) Bingo


Bon maintenant que l'on a decortiqué la routine, il faut en faire un keygen.




-|- C. Thx

A tout le chan #old-school sur irc.worldnet.net, Misto, Kyler, Goda, Azerty.. 

retrouvez sur http://thomas.openmod.org l'ensemble de mes tutos et ezines.

a+
thomas