CrackMe 01 de Chronos
par Kharneth
 
Outils utilisésPublicCible
 - PEId
 - SmartCheck
 - LordPE
 - OllyDbg
 - Calculatrice
 - Papier, Crayon, Cerveau 5.0
 Débutant en Cracking
ayant des connaissances de base en programmation
 CrackMe01_Chronos
 
1 - PEId 

      On commence par une analyse rapide avec PeId pour vérifier que le programme n'est pas compressé ou crypté. Il ne l'est pas.
Par contre on voit qu'il a été compilé avec Visual Basic 5.0. On l'aura de toute façon remarqué à l'icône significatif des programmes VB.

Pour étudier les programmes VB, l'outil idéal est Smartcheck.

2 - SmartCheck 

      On lance SmartCheck, on charge le programme avec Ctrl+o, puis on le lance avec F5.
On entre un code, par exemple: 123456, puis on click sur le bouton "Verifier". Une MessageBox apparait nous demandant de recommencer. On click sur le bouton "OK" puis on regarde dans SmartCheck pour voir les événements qu'il a capturé.

      On double-click sur l'événement "_Click" pour voir ce qu'il contient. On remarque la MessageBox: "MsgBox(VARIANT:..." qui nous demandait de recommencer. Juste au-dessus, il y a une ligne intéressante dans laquelle on voit notre code.
      On comprend facilement que la fonction prend notre chaine de caractères (ou plus exactement les chiffres compris dans cette chaine.) puis la transforme en un nombre Réel. Si l'on n'avait entré que des caractères alphabétiques, une erreur aurait été générée.
      Voilà tout ce que nous affiche SmartCheck! Il va falloir approfondir tout ça sous OllyDbg. Mais avant, on va noter l'adresse de la fonction de conversion. En clickant dessus, on peut voir ceci dans la fenêtre de droite:

On note l'adresse qui apparait: CRACKME.EXE!00001D71. Cette adresse correspond à l'offset dans le fichier. Elle est différente de l'adresse en mémoire qui apparait sous OllyDbg. Il va donc falloir calculer cette adresse avant de l'exploiter. Pour cela, on va utiliser LordPe

3 - LordPE 

      (Pour cette partie, je recommande de lire le Memento 5 de SHMEITCORP qui contient une description détaillée du format de fichier PE).
      On lance LordPE, on click sur le bouton "PE Editor" puis on choisi le CrackME. Dans la fenêtre qui apparait, on click sur le bouton "Sections".

Pour calculer la bonne adresse, on utilise la formule suivante:

VA = Offset + ImageBase + Virtual Offset - Raw Offset

L'offset correspond à l'adresse récupérée dans SmartCheck soit: 0x00001D71.
L'ImageBase apparait dans la première fenêtre de LordPE: 0x00400000.
Le VOffset et le ROffset dépendent de la section dans laquelle se trouve notre adresse dans le fichier. Pour déterminer ça, on regarde les ROffset des sections. La section .TEXT commence à l'offset 1000 et se termine à l'offset 3000. Notre adresse 1D71 est comprise entre les 2 et se trouve donc dans la section .TEXT.
On note donc les VOffset et ROffset de cette section: 0x00001000 et 0x00001000.
      Finalement, nous obtenons cette formlule:

VA = 0x00001D71 + 0x00400000 + 0x00001000 - 0x00001000

Notre adresse est donc: 0x00401D71. On va maintenant pouvoir la chercher sous OllyDbg.
      Une alternative plus simple avec LordPE est de clicker sur le bouton "FLC", puis "Offset", entrer l'adresse 1D71, puis clicker sur "DO". Notre adresse calculée apparait alors dans le champ "VA".

4 - OllyDbg 
      On lance OllyDbg puis on charge le CrackMe. On va directement à l'adresse précédemment calculée en faisant Ctrl+g, puis en tapant 401D71. On arrive à l'adresse 0x00401D70 sur un appel de la fonction vbaR8Str.
En regardant en-dessous, on peut voir plusieurs choses intéressantes:
 - L'instruction suivante en 0x00401D76 indique que le résultat de la fonction sera multiplié par un nombre.
 - En 0x00401DF0, on voit une fonction qui teste l'égalité entre 2 valeurs.
 - Suivi d'un saut conditionnel en 0x00401DFB qui nous envois vers l'affichage de la MsgBox "Recommence".
 - Sinon, la chaine "Bravo..." est chargée en 0x00401E35 puis, la MsgBox est affichée en 0x00401E6D.

      On pose donc un Point d'arrêt en 0x00401D70 en pressant F2 puis on lance le programme en pressant F9. On entre notre code bidon (123456), puis on click sur "Verifier". OllyDbg stope l'exécution du programme sur notre point d'arrêt. On va maintenant inspecter les registres.

On voit clairement que EAX contient l'adresse où est stocké notre code. On passe à l'instruction suivante en pressant F8 et là 2 choses importantes apparaissent:


      On voit que notre code, maintenant converti en nombre Réel, est stocké dans le registre ST0. Dans la fenêtre d'information, on voit que le pointeur de l'instruction FMUL contient la valeur 666. En fait, cette valeur est là depuis le début du programme et on aurait pu la voir lors de l'étude préalable. Mais comme l'instruction FMUL utilise un pointeur et non une constante, cette valeur aurait pu changer au cours du programme. Il est donc préférable de la noter maintenant.
      On avance encore d'une instruction en pressant F8. Le registre ST0 contient maintenant le résultat de la multiplication soit 82221696. L'instruction suivante place cette valeur dans le registre ST7.
      On trace jusqu'en 0x00401DF0 pour voir ce que donne la fonction vbaVarTstEq. On l'exécute en pressant une fois de plus F8.

      On voit toujours la valeur correspondante à notre code dans ST7 mais une nouvelle valeur est apparue dans ST6. Cette valeur doit être celle testée par la fonction vbaVarTstEq. On en conclut donc que notre code multiplié par 666 doit être égal à 596351718.
      On sort la calculatrice, on tape 596351718 / 666, et on obtient: 895423. On relance le CrackME, on tape ce code et la MsgBox nous félicite! :o)

Kharneth 

I'll never look into your eyes...again
Can you picture what will be, So limitless and free


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