WTF_CrackMe By elooo
par Kharneth
 
Outils utilisésPublicCible
 - PeID
 - OllyDbg
 - Google
 - Papier, Crayon, Cerveau 5.0
 Débutant / avancé en Cracking
ayant de bonnes connaissances en programmation
 WTF_CrackMe.exe
 
I - Présentations 

      Nous sommes en présence d'une jolie jeune fille, nommée WTF CrackMe, qui nous invite à prendre du plaisir avec elle. Ne pouvant résister aux brunes ténébreuses, je m'exécute immédiatement !
      Mais attention à ne pas trop brusquer la Demoiselle! D'abord, elle indique qu'il serait plus intéressant de lui fournir un couple nom / serial d'au moins 3 caractères chacun. Et surtout un couple incorrect fait violemment fuire cette Beauté! Nous devons donc procéder avec délicatesse.
      Une première approche en la présence de PeID ne permet pas de la dévoiler, il semble qu'elle préfère un tête à tête plus intime. Je décide donc de lui présenter mon HolyBed, plus approprié à ce genre de rencontre.

II - Passage à l'acte 

      Etant parvenu à la déshabiller, il reste encore à lui faire dévoiler tous ces charmes. Je commence donc par chercher la zone érogène 111 (WM_COMMAND), celle-ci étant découpée en plusieurs parties, je finis par retenir celle qui nous permet une meilleure communication (ID 199).
      Lorsqu'une zone intéressante est repérée, toujours penser à bien la noter et inscrire tous les labels possibles.

      A partir de là, il ne reste qu'une seule possibilité que je vais donc suivre en 0040142A.

      Intéressée mais prudente, ma douce invitée préfère vérifier que mes intentions envers elle ne sont point hostiles, avant de me permettre de poursuivre plus intensément notre relation. Il faut savoir qu'il existe une technique qui permet d'interpréter correctement ses signaux (Analysis-->During next analysis, treat selection as).

      Une fois rassurée, elle modifie le nom que je lui ai donné en ajoutant d'abord 1E aux 5eme, 9eme et 13eme caractères. Puis Xor chaque caractère avec 13 valeurs, ce qui me permet de supposer que le nom doit faire 13 caractères.

      Je continue là où elle me demande d'aller (en 004018D1) et découvre qu'elle va enfin se décontracter et m'autoriser de nouvelles possibilitées en sortant un Kris finement aiguisé.

      C'est alors qu'elle grave profondément dans sa chair, mon nom crypté (en 004018B5).

      Elle effectue de nouveaux des calculs, mais sur chaque WORD du Serial cette fois. 6E69 (peut être une proposition...) est ajouté puis 0063 est retranché. Malheureusement, je suis surpris de constater qu'elle doute encore de la douceur de mes caresses et me tend subitement un piège. Mais je suis déterminer à aller jusqu'au bout et j'accéderai à toutes ses requêtes. Je ralentis donc le rythme qu'elle semble trouver trop soutenu.

      Finalement, le serial est crypté avec 13 nouvelles valeurs. on peut donc supposé que le serial contient également 13 caractères.

      Elle mutile de nouveau son corps en inscrivant le serial à la suite de mon nom avant de répandre un liquide noir sur ses plaies. Les lettres gravées se transforment alors, mais le résultat ne semble pas lui convenir, et je ne peux qu'assister impuissant à sa fuite dans un hurlement de fureur. Il parait évident que je ne suis pas celui qu'elle espérait.

III - Création de l'illusion 

Calculs sur le nom:

Nom:     1  2  3  4  5  6  7  8  9  10 11 12 13
+                    1E          1E          1E
Xor:     2C 35 E0 87 83 A9 23 04 02 01 73 37 87

= 1ere partie du code de la MsgBox
Calculs sur le serial:
Serial:     1  2  3  4  5  6  7  8  9  10 11 12 13
+           6E 69 6E 69 6E 69 6E 69 6E 69 6E 69
-              63    63    63    63    63 
Xor         91 47 A3 26 80 4B 0F 23 3B 5B DB CE 21

= 2eme partie du code de la MsgBox
Code classique d'une MsgBox:
6A 10 68 D3 32 40 00 68 7F 32 40 00 6A 00 E8 08 05 00 00

<Bad Guy>6A 10         PUSH 10                            ; /Style = MB_OK|MB_ICONHAND
00401433 68 D3324000   PUSH 004032D3                      ; |Title = "Hey Guy..."
00401438 68 7F324000   PUSH 0040327F                      ; |Text = "It will be more..."
0040143D 6A 00         PUSH 0                             ; |hOwner = NULL
0040143F E8 08050000   CALL <JMP.&user32.MessageBoxA>     ; \MessageBoxA
Déjà le code d'une MsgBox classique fait 19 octets au lieu des 26 (2x13) supposés.
      On peut supposer aussi que les 2 x 8 octets xor les 2 clés (Key03 et Key04) correspondent au titre et au texte de la MsgBox (voir la dernière capture):
<Key03>     26 25 A3 9C - 65 B4 77 1E 
Xor 8 1ers octets du code
= Titre de la MsgBox

<Key04>     03 12 37 69 - 3E 5D B7 20 
Xor 8 autres octets du code
= Texte de la MsgBox
      Nous avons donc plusieurs indices pour retrouver le code de la MsgBox. il s'agit maintenant de faire des tests et de vérifier si le titre et le texte veulent dire quelque chose.

      La première MsgBox utilise le style MB_ICONHAND pour afficher l'icône de danger. On suppose donc que ici, l'icône d'information sera utilisé. Ce qui donne les opcodes 6A 40 pour Push MB_ICONINFORMATION. On vérifie avec XOR 25 26 que ça pourrait vouloir dire quelque chose et effectivement on obtient 4C 65 qui correspond à "Le".
      Ca s'annonce pas trop mal. On suppose donc que la suite serait un truc du style "Le pass...". On prend donc les codes de " pass" (20 70 61 73 73) et on Xor avec Key03.
     L  e     p  a  s  s
     4C 65 20 70 61 73 73 
Xor  26 25 A3 9C 65 B4 77
=    6A 40 83 EC 04 C7 04

Code:
     6A 40               PUSH 40
     83EC 04             SUB ESP, 4
     C704XX XXXXXXXX     MOV DWORD PTR [...],...		 
      On voit que le 2eme Push est émulé de manière simple. Ce Push correspond à l'adresse du titre, c'est à dire Key03 soit 0040324D. Les instructions manquantes sont donc [ESP], 0040324D soit les opcodes 24 4D 32 40 00.
      En appliquant les calculs inverses du nom, on trouve justement le nom: "Fuckin' 1337". Mais il manque le dernier caractère. Après avoir tester différents opcode, on ne trouve rien qui puisse correspondre. Donc on va réfléchir sur d'autres façons d'émuler un push. On peut par exemple essayer:
004018C1  B8 56324000  MOV EAX, OFFSET <Key04> 
004018C6  50           PUSH EAX 
      Le B8 nous donne un "!" qui correspond bien. Donc on va essayer avec les opcodes suivants pour faire les calculs sur le serial.
     56 32 40 00 50
Xor  91 47 A3 26 80
+    00 63 00 63 00
-    6E 69 6E 69 6E
=    59 6F 75 20 62
     Y  o  u     b
      Pour la suite, on sait que les 5 derniers opcodes seront E8 7D 00 00 00 car ils correspondent à CALL <JMP.&user32.MessageBoxA>. On effectue donc les calculs inverses pour retrouver le serial et on obtient: "You b___ e me!".
      Il nous manque donc le Push 0 juste avant l'appel à la MsgBox. Et nous avons 3 octets pour ça. Après une brève réflexion, on trouve Xor eax, eax Push eax. Mais le serial ainsi obtenu ne veut rien dire. Donc on va tester les différents registres jusqu'à trouver le bon qui est EDX.
      Nous trouvons finalement le code suivant:
<PolyCode>        \6A 40               PUSH 40
004018B7        .  83EC 04             SUB ESP, 4
004018BA        .  C70424 4D324000     MOV DWORD PTR [ESP], OFFSET <Key03>
004018C1           B8 56324000         MOV EAX, OFFSET <Key04>            
004018C6        .  50                  PUSH EAX                               
004018C7        .  33D2                XOR EDX, EDX                          
004018C9        .  52                  PUSH EDX                                 
004018CA        .  E8 7D000000         CALL <JMP.&user32.MessageBoxA>        
      Ce qui correspond au couple Nom / Serial:
Fuckin' 1337!
You broke me!


IV - Retrouvailles 

      Je peux maintenant me présenter en toute confiance devant la Belle ténébreuse qui reste tout aussi suspicieuse. Mais cette fois, ses plaies se referment, et elle peut ainsi, enfin, s'offrir pleinement à moi.


Father, yes son, I want to kill you
Mother...I want to...fuck you


Merci à toutes les personnes qui se battent pour que l'Information soit accessible à tous!