Après un petit rappelle de xylitol (merci), je viens vous mettre mon foome I ..
Je l'avais présenté sur FC et donc je n'ai pas vu d'importance à l'exposer sur le blog (vu les critiques :p) .
level : 0.5 || 1
secure : no package ..
Anti debugger (mal implémenté)
Objectifs :
- faire un keygen. ( 1 )
- trouver le serial pour son pseudo. (0.5 )
Je l'avais présenté sur FC et donc je n'ai pas vu d'importance à l'exposer sur le blog (vu les critiques :p) .
level : 0.5 || 1
secure : no package ..
Anti debugger (mal implémenté)
Objectifs :
- faire un keygen. ( 1 )
- trouver le serial pour son pseudo. (0.5 )
Article en question : http://fyury.blogspot.com/2008/11/foome-part-i.html.
Je télécharge l'archive sans trop lire les infos, je me focalise juste sur ça :
- faire un keygen. ( 1 )
- trouver le serial pour son pseudo. (0.5 )
- trouver le serial pour son pseudo. (0.5 )
Je me suis dit, au début, que je n'arriverai pas à faire le keygen. J'y suis finalement arrivé, après plusieurs essais car je suis quelqu'un de trop pressé.
Allez, je décompresse l'archive dans un dossier, et je lance foome.exe.
C:\Documents and Settings\Geoffrey\Bureau\foome>"foome {part I}.exe"
[ foome part I by fyuw]
Login : Geo0w
pwd : 15612
[ foome part I by fyuw]
Login : Geo0w
pwd : 15612
Une fenêtre apparaît, et me dit "t4pz" avec pour titre "Iz N0t da g00d password". Put*** de foome de m****, j'vais te montrer qui c'est la tapz ! <>
Je me précipite pour ouvrir le bordel avec ollydbg. Je ne tarde pas à trouver la section de code la plus intéressante :
00401431 |> C70424 2C30400>MOV DWORD PTR SS:[ESP],foome_{p.0040302C ; ||||ASCII " [ foome part I by fyuw]
Login : "
00401438 |. E8 C7060000 CALL <JMP.&msvcrt.printf> ; |||\printf
0040143D |. 8D85 88FEFFFF LEA EAX,DWORD PTR SS:[EBP-178] ; |||
00401443 |. 894424 04 MOV DWORD PTR SS:[ESP+4],EAX ; |||
00401447 |. C70424 5F30400>MOV DWORD PTR SS:[ESP],foome_{p.0040305F ; |||ASCII "%s"
0040144E |. E8 A9060000 CALL <JMP.&msvcrt.scanf> ; ||\scanf
00401453 |. 8D85 88FEFFFF LEA EAX,DWORD PTR SS:[EBP-178] ; ||
00401459 |. 890424 MOV DWORD PTR SS:[ESP],EAX ; ||
0040145C |. E8 93060000 CALL 00401461 |. 83F8 04 CMP EAX,4 ; |
00401464 |. 77 1B JA SHORT foome_{p.00401481 ; |
00401466 |. C70424 6230400>MOV DWORD PTR SS:[ESP],foome_{p.00403062 ; |ASCII "Need more 5 char..."
0040146D |. E8 92060000 CALL <JMP.&msvcrt.printf> ; \printf
00401472 |. C785 84FEFFFF >MOV DWORD PTR SS:[EBP-17C],0
0040147C |. E9 F5000000 JMP foome_{p.00401576
00401481 |> 8D85 88FEFFFF LEA EAX,DWORD PTR SS:[EBP-178] ; ||
00401487 |. 890424 MOV DWORD PTR SS:[ESP],EAX ; ||
0040148A |. E8 65060000 CALL 0040148F |. 83F8 0B CMP EAX,0B ; |
00401492 |. 76 1B JBE SHORT foome_{p.004014AF ; |
00401494 |. C70424 7630400>MOV DWORD PTR SS:[ESP],foome_{p.00403076 ; |ASCII "Need less 10 char..."
0040149B |. E8 64060000 CALL <JMP.&msvcrt.printf> ; \printf
004014A0 |. C785 84FEFFFF >MOV DWORD PTR SS:[EBP-17C],0
004014AA |. E9 C7000000 JMP foome_{p.00401576
004014AF |> C70424 8B30400>MOV DWORD PTR SS:[ESP],foome_{p.0040308B ; |||||ASCII "pwd : "
004014B6 |. E8 49060000 CALL <JMP.&msvcrt.printf> ; ||||\printf
004014BB |. 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C] ; ||||
004014C1 |. 894424 04 MOV DWORD PTR SS:[ESP+4],EAX ; ||||
004014C5 |. C70424 9230400>MOV DWORD PTR SS:[ESP],foome_{p.00403092 ; ||||ASCII "%d"
004014CC |. E8 2B060000 CALL <JMP.&msvcrt.scanf> ; |||\scanf
004014D1 |. 0FBE9D 8AFEFFF>MOVSX EBX,BYTE PTR SS:[EBP-176] ; |||
004014D8 |. 8D85 88FEFFFF LEA EAX,DWORD PTR SS:[EBP-178] ; |||
004014DE |. 890424 MOV DWORD PTR SS:[ESP],EAX ; |||
004014E1 |. E8 0E060000 CALL 004014E6 |. 89C2 MOV EDX,EAX ; ||
004014E8 |. 89D0 MOV EAX,EDX ; ||
004014EA |. 01C0 ADD EAX,EAX ; ||
004014EC |. 01D0 ADD EAX,EDX ; ||
004014EE |. C1E0 09 SHL EAX,9 ; ||
004014F1 |. 01D0 ADD EAX,EDX ; ||
004014F3 |. 01C3 ADD EBX,EAX ; ||
004014F5 |. 8B85 A0FEFFFF MOV EAX,DWORD PTR SS:[EBP-160] ; ||
004014FB |. 890424 MOV DWORD PTR SS:[ESP],EAX ; ||
004014FE |. E8 F1050000 CALL <JMP.&msvcrt.strlen> ; |\strlen
00401503 |. 29C3 SUB EBX,EAX ; |
00401505 |. 89D8 MOV EAX,EBX ; |
00401507 |. 83C0 0C ADD EAX,0C ; |
0040150A |. 3985 B4FEFFFF CMP DWORD PTR SS:[EBP-14C],EAX ; |
00401510 |. 74 33 JE SHORT foome_{p.00401545 ; |
00401512 |. C74424 0C 0000>MOV DWORD PTR SS:[ESP+C],0 ; |
0040151A |. C74424 08 9530>MOV DWORD PTR SS:[ESP+8],foome_{p.004030>; |ASCII "Iz N0t da g00d password"
00401522 |. C74424 04 2730>MOV DWORD PTR SS:[ESP+4],foome_{p.004030>; |ASCII "t4pZ"
0040152A |. C70424 0000000>MOV DWORD PTR SS:[ESP],0 ; |
00401531 |. E8 06060000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401536 |. 83EC 10 SUB ESP,10
00401539 |. C785 84FEFFFF >MOV DWORD PTR SS:[EBP-17C],0
00401543 |. EB 31 JMP SHORT foome_{p.00401576
00401545 |> C74424 0C 0000>MOV DWORD PTR SS:[ESP+C],0 ; |
0040154D |. C74424 08 AD30>MOV DWORD PTR SS:[ESP+8],foome_{p.004030>; |ASCII "U win.. make a keygen"
00401555 |. C74424 04 2730>MOV DWORD PTR SS:[ESP+4],foome_{p.004030>; |ASCII "t4pZ"
0040155D |. C70424 0000000>MOV DWORD PTR SS:[ESP],0 ; |
00401564 |. E8 D3050000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxAJe fais un break sur l'adresse 004014CC, qui va appeler la fonction scanf lors de l'input du password. Je lance, et là, une autre fenêtre avec titre "U sUck" et qui m'affiche de nouveau un "t4pZ". Mais quelle connasse ! (même plus envie de censurer, c'est plus fort que moi)
Je me dis donc - toujours sans avoir lu qu'il y avait un antidebuger mal implémenté - qu'il y a une protection à contourner. Miracle, je repère ce bout de code :
00401324 |. C785 98FEFFFF >MOV DWORD PTR SS:[EBP-168],foome_{p.0040>; |ASCII "OLLYDBG.EXE"
0040132E |. C785 9CFEFFFF >MOV DWORD PTR SS:[EBP-164],foome_{p.0040>; |ASCII "idag.exe"
00401338 |. C785 A0FEFFFF >MOV DWORD PTR SS:[EBP-160],foome_{p.0040>; |ASCII "windbg.exe"Sans hésitation, je modifie les valeurs dans le dump :
- "OLLYDBG.EXE" devient "tasoeur.EXE" ;
- "idag.exe" devient "stfu.exe" ;
- "windbg.exe" devient "azerty.exe".
Je relance, et là... Pas de fenêtre ! C'est qui la tapz ?! Haha !
Je rentre donc en login : Geo0w, et en pwd : 2151 (truc au pif, quoi).
Je continue...
Sans rentrer dans les détails, j'arrive à la ligne suivante après quelques coups de F8 (pour tracer le code sans s'attarder dans les CALLs) :
0040150A |. 3985 B4FEFFFF CMP DWORD PTR SS:[EBP-14C],EAX
Je regarde eax, et il contient 00001E76. En décimal, ça donne : 7798.
Je ferme ollydbg et tout le bordel, puis je relance foome.exe en ligne de commande :
C:\Documents and Settings\Geoffrey\Bureau\foome>"foome {part I}.exe"
[ foome part I by fyuw]
Login : Geo0w
pwd : 7798
[ foome part I by fyuw]
Login : Geo0w
pwd : 7798
Encore une fenêtre, sauf que, dorénavant, son titre est différent : "U win.. make a keygen", puis, elle affiche encore un "t4pZ". Cette saloperie mériterait que je l'insulte comme un DR_KILLER. Au passage, make me a sandwich, saloperie !
Bon, désolé pour la vulgarité, mais bon... C'est éprouvant, ça sera mon premier keygen de ma vie ! Oui, je suis énervé et j'oublie le fait d'avoir pensé tout à l'heure que je n'y arriverai pas. Je fonce, tête baissée !
Je réouvre mon copain ollydbg, je remodifie les valeurs dans le dump :
- "OLLYDBG.EXE" devient "tasoeur.EXE" ;
- "idag.exe" devient "stfu.exe" ;
- "windbg.exe" devient "azerty.exe".
Puis, cette fois, je break sur :
004014CC |. E8 2B060000 CALL <JMP.&msvcrt.scanf> ; |||\scanf
Cette ligne correspond au CALL juste après l'input du password. Hop, je lance, je rentre "albert" en login et "11111" en pwd, puis ça break. Je trace le code :
004014E6 |. 89C2 MOV EDX,EAX ; ||
004014E8 |. 89D0 MOV EAX,EDX ; ||
004014EA |. 01C0 ADD EAX,EAX ; ||
004014EC |. 01D0 ADD EAX,EDX ; ||
004014EE |. C1E0 09 SHL EAX,9 ; ||
004014F1 |. 01D0 ADD EAX,EDX ; ||
004014F3 |. 01C3 ADD EBX,EAX ; ||
004014F5 |. 8B85 A0FEFFFF MOV EAX,DWORD PTR SS:[EBP-160] ; ||
004014FB |. 890424 MOV DWORD PTR SS:[ESP],EAX ; ||
004014FE |. E8 F1050000 CALL <JMP.&msvcrt.strlen> ; |\strlen
00401503 |. 29C3 SUB EBX,EAX ; |
00401505 |. 89D8 MOV EAX,EBX ; |
00401507 |. 83C0 0C ADD EAX,0C ; |
0040150A |. 3985 B4FEFFFF CMP DWORD PTR SS:[EBP-14C],EAX ; |
C'est à la dernière ligne que notre password entré est comparé à la clef véritable. Donc, j'analyse le code assembleur au-dessus, et j'en viens à traduire cela en l'algorithme suivant (après plusieurs sessions de debugging) :
keygen <- longueur(login)
keygen <- keygen * 3
keygen <- keygen * 512
keygen <- keygen + longueur(login) (merci à UnKnOwN*DrAgOoN pour avoir signalé l'oubli)
keygen <- keygen + (valeur entière)login[3]
keygen <- keygen - longueur_chaine("windbg.exe")
keygen <- keygen + 12
Au final, je fais mon keygen :
http://venom630.free.fr/geo/autre_chose/foome__fyuw/keygen_c.txt
Il marche niquel.
Conclusion ?
Eprouvant, très éprouvant. Fyury, si tu passes sur ce blog, je tenais à te remercier d'avoir mis à disposition un tel challenge. J'espère résoudre d'autres de tes oeuvres avec une difficulté croissante ; c'est en forgeant qu'on devient forgeron.
Geo
Edit : ajout de http://xylitol.free.fr/Home/index.php dans la liste des copains. Superbe site sur le reverse engineering à visiter !
Euh que dire de plus ^^, explication très précise, je vais mettre ton tuto sur mon blog, et je te fou dans les rss :).
RépondreSupprimerBref merci Geo pour la conclusion et lol je reste modeste. Mais oui je vais sans doute faire des challenges un peu plus hard (si je peux avec mes compétences).
Encore un domaine qui m'intéresse depuis plus d'un an, par contre, question stupide : pourquoi ces messieurs les producteurs de crackme ne _compilent-ils jamais leur code sur des OS libres et propres x_x"""_ ?! Bouh :'(.
RépondreSupprimerBon allez je me console en me disant qu'à défaut de crackme, un bof, c'est plus amusant à exploiter sous Win' \o/.
Good work , on ne peu qu'apprécier ;-)
RépondreSupprimerBonne continuation a vous !
See ya ..
kmkz