x3chun's Crypto keygenme 2

 

Nous savons ici que nous avons à faire à un crackme utilisant de la crypto, pour identifier certains algo je vais le scanner avec CryptTool v1.2

CryptTool
Offset 19B2 : Possibility of Hash MD
Nothing : SHA 384 Hash
Nothing : SHA 384 Hash
Nothing : SHA 512 Hash
Nothing : Tiger Hash
Offset 121E : TEA or ExTEA encryption
Offset 11CC : TEA or ExTea decryption

Nothing : DES
Nothing : newDES
Nothing : BlowFish
Nothing : RC2
Nothing : RC4
Nothing : Rinjael
Nothing : TwoFish
Nothing : Gost
Nothing : Misty 1
Nothing : Tiger Hash

On sait déjà qu'il faut s'attendre à du TEA associé à un hash de type MD. Cela sera à vérifier bien sur en désassemblant le keygenme. Passons à l'analyse

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
             |
             :004010F2 8B3D98504000            mov edi, dword ptr [00405098]
             :004010F8 8D459C                  lea eax, dword ptr [ebp-64]
             :004010FB 6A64                    push 00000064
             :004010FD 50                      push eax
             :004010FE 68E9030000              push 000003E9
             :00401103 56                      push esi
             :00401104 FFD7                    call edi          // call GetDlgItemTextA
             :00401106 8BD8                    mov ebx, eax
             :00401108 83FB03                  cmp ebx, 00000003 // le nom doit avoir une longueur mini
             :0040110B 7D1C                    jge 00401129      // de 3 car

 

             :0040112F 6A64                    push 00000064
:00401131 51 push ecx
:00401132 68E8030000 push 000003E8
:00401137 56 push esi
:00401138 FFD7 call edi // call GetDlgItemTextA
:0040113A 83F810 cmp eax, 00000010 // le serial doit avoir une longueur
:0040113D 75CE jne 0040110D // de 16 car (10h)

 

             :00401146 E8B5FEFFFF              call 00401000 // fonction Hexstring to dword sur les 8 premiers chiffres
:0040114B 8985B0FDFFFF mov dword ptr [ebp-250], eax // stock ce dword

 

             :00401158 E8A3FEFFFF              call 00401000 //idem avec les 8 suivants
:0040115D 8985B4FDFFFF mov dword ptr [ebp-24C], eax // stock

 

             :0040116A E831080000              call 004019A0 // initialisation du hash MD
----------------------------------------------------------------------------
on repere ici l'initialisation d'un hash MD, si l'on regarde le dossier de
christal dans le M5 :
:00401224 mov dword_0_4140B4, 67452301h
:0040122E mov dword_0_4140B8, EFCDAB89h
:00401238 mov dword_0_4140BC, 98BADCFEh...
(pour le dernier dw, il suffit de chercher sur internet)
on note une différence dans le 3ème dword, le hash à donc été modifié et
il faudra en tenir compte dans le keygen
----------------------------------------------------------------------------
:004019A0 8B542404 mov edx, dword ptr [esp+04]
:004019A4 57 push edi
:004019A5 B917000000 mov ecx, 00000017
:004019AA 33C0 xor eax, eax
:004019AC 8BFA mov edi, edx
:004019AE F3 repz
:004019AF AB stosd
:004019B0 C70201234567 mov dword ptr [edx], 67452301
:004019B6 C7420489ABCDEF mov [edx+04], EFCDAB89
:004019BD C74208EFCDAB89 mov [edx+08], 89ABCDEF
:004019C4 C7420C76543210 mov [edx+0C], 10325476
:004019CB 894214 mov dword ptr [edx+14], eax
:004019CE 894210 mov dword ptr [edx+10], eax
:004019D1 5F pop edi
:004019D2 C3 ret

 

             :0040116F 8D559C                  lea edx, dword ptr [ebp-64] //nom dans edx
             :00401172 53                      push ebx
             :00401173 8D8540FFFFFF            lea eax, dword ptr [ebp-C0]
             :00401179 52                      push edx
             :0040117A 50                      push eax
             :0040117B E860080000              call 004019E0 // md5_update
             :00401180 8D8D40FFFFFF            lea ecx, dword ptr [ebp-C0]
             :00401186 8D9578FEFFFF            lea edx, dword ptr [ebp-188]
             :0040118C 51                      push ecx
             :0040118D 52                      push edx
             :0040118E E83D090000              call 00401AD0 //md5_finish (calcule le hash)

pour savoir quel hash a été modifié on va remplacer la valeur d'initialisation par la vraie valeur,faire calculer le hash par le keygenme et la comparer avec un hash donné par CryptTool. C'est un hash MD4

à télécharger : md4.c + md4.h

A noter que si l'on entre dans le call de calcul, on voit que x3chun fait un lstrcpy du hash vers une variable, il faudrat faire de même dans notre keygen
pour que tous les serials généré soient valides. En effet le hash est considéré comme une string donc la copie s'arretera au premier byte égal à 00.

             :00401B4F 56                      push esi
             :00401B50 50                      push eax             
* Reference To: KERNEL32.lstrcpyA, Ord:0302h
             |
             :00401B51 FF1554504000 Call dword ptr [00405054]

on arrive à l'initialisation du TEA.

             :004011CB BA2037EFC6             mov edx, C6EF3720 // valeur caracteristique du tea pour le decodage
             :004011D0 8B33                   mov esi, dword ptr [ebx] // 1er dword du serial
             :004011D2 8B7B04                 mov edi, dword ptr [ebx+04] // 2eme dword

suit l'algo, il change quelque peu par rapport à celui vu dans le M5, mais on s'y retrouve :), pour l'explication en détail sur le tea je vous laisse regarder cette page
http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html (thx jB)

donc l'algo prend une variable Data_tea de 2 dwords (64 bits -> le fake serial) et une variable Key de 4 dwords (128 bits -> le hash) decode le tout et renvoie dans Data_tea 2 dwords.

le test se termine par la comparaison entre data_tea[0], 78336368 et data_tea[1], 756E3A29

             :0040124D 81FE68633378           cmp esi, 78336368
             :00401253 7404                   je 00401259
             :00401255 83450C01               add dword ptr [ebp+0C], 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401253(C) | :00401259 81FF293A6E75 cmp edi, 756E3A29 :0040125F 7404 je 00401265

Donc pour faire un keygen valide :

modified md4(Name)
copie du hash vers un autre buffer
encrypter 78336368 et 756E3A29 avec le hash

Le code source est téléchargable ici : keygen.zip

 

Tone 2003 scorp