**Reverse Me 1** par Kharneth (défi niveau 1 du forum NewFFR).
Kharneth nous a préparé un reverseme facile (dit-il). J'ai vaguement vu son niveau sur les crackme de synapsus, donc on aurait pu s'attendre a plus difficile (ouf sauvés).Ceci dit moi je me suis bien amusé.
L'executable est programmé sous Masm32 (c'est marqué dessus), chargez le sous OllyDBG. L'EntryPoint n'est pas en 401000, pourtant le programme n'est pas packé/crypté; l'explication est simple : quand on voit un entrypoint qui n'est pas en 401000 sur ce type de défi facile, la routine de vérfifcation est juste audessus de celui-ci :D
Elle se trahit par :
00401014 |. E8 51010000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemText
(pour ceux qui souhaitent mettre un PBX c'est dont sur cette API que vous le ferez :D)
Le listing OllyDBG parait clair ey on va pouvoir analyser en 'statique' sous Proview :
En fait c'est une protection a Sérial unique harcodé (403159) mais pas en clair, en crypté bien sûr.
On fait donc : sérial entré -> sérial entré et crypté et on compare après le sérial entré et crypté au sérial harcodé.
La solution est de renverser la routine de cryption (qui devient donc une routine de décryption) et l'appliquer a sérial harcodé.
Après avoir récupéré les 9 octets composant le sérial harcodé (regardez en 401359 pour les avoir), j'ai testé sa avec Masm :
Comme prévu, une MessageBox s'affiche : on viens de trouver le sérial valide : 'Nébuleuse'.
Il nous reste maintenant à faire ce reversing.
Premierement il faut faire sauter la MessageBox au démarrage : vous la trouverez en 4010E0.
Comment elle est apellée ? c'est simple, analysez en haut de la MessageBox, une DialogBox est affichée, sa procédure CallBack est repérable : c'est le deuxieme élément PUSHé a l'apele de DialogBoxParamA qui affiche la boite de dialogue. Rendez-vous a l'entrée de cette procédure CallBack : après le 'stack frame', vous avez un CMP suivit d'un JNZ qui saute par-dessus la MessageBox incriminée. Patchez le JNZ en JMP : une de moins !
004010CF EB 16 JMP SHORT ReverseM.004010E7 ; voila ca que ca donne une fois modifié !
Maintenant à l'attaque de l'affichage du sérial dans le champ texte. Karneth se sert 1 seule fois de l'api SetDlgItemTextA pour effacer le champ après avoir
comparér les 2 sérials et trouvé une différence. On va donc modifier cette API pour qu'elle affiche le sérial hardcodé : le premier argument PUSHé devient
donc l'dresse de ce sérial harcodé : 00401359.On va se servir aussi de la boucle de cryption originale que l'on aura modifiée. En théroie je sait pas si je suis très clair, le mieux c'est d'aller voir le code :
On viens de solutionner le reverseme a la manière facile !
Bon maintenant pour les plus motivès disait Kharneth, faut afficher le Sérial au démarrage. En fait c'est surper simple.
Vous cous rapellez la MessageBox affichée au démarrage ? le CMP au dessus c'était un CMP eax, WM_INITDIALOG.
A partir de la on descend jusqu'a trouver ceci :
.text:004010E7 cmp eax, WM_COMMAND
.text:004010EC jnz short NoCommand
.text:004010EE mov eax, [ebp+arg_8]
.text:004010F1 cmp ax, 3EAh ; si on a clicher sur le boutton afficher
.text:004010F5 jnz short NoClick
.text:004010F7 push [ebp+hDlg] ; alors on passe a la routine OnClick,
.text:004010F7 ; celle qu'on a modifiée pour afficher le sérial...
.text:004010FA call OnClick
La solution est simple, on va modifier après le CMP eax, WM_INITDIALOG pour qu'il redirige vers la procédure OnClick.
Voilà ce que ca donnne sous OllyDBG :
Voilà, passer de la solution facile a la solution 'pour motivés' prenait 3 octets..
Pour ce ReverseMe excellent, c'est fini, mais j'espére que Kharneth récidivera :D
Un grand merci à : #FFF, CrFF, Nemrod34 et a tous ceux que j'oublie :p
RanDioX.