CrackMe 01 de Chronos par Kharneth | |||
---|---|---|---|
Outils utilisés | Public | Cible | |
- 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. ![]() | |||
2 - SmartCheck | |||
On lance SmartCheck, on charge le programme avec Ctrl+o, puis on le lance avec F5. ![]()
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 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). ![]()
Pour calculer la bonne adresse, on utilise la formule suivante:
L'offset correspond à l'adresse récupérée dans SmartCheck soit: 0x00001D71.
Notre adresse est donc: 0x00401D71. On va maintenant pouvoir la chercher sous OllyDbg. | |||
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 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. | |||
Kharneth | |||
I'll never look into your eyes...again Can you picture what will be, So limitless and free | |||
![]() |