Challenge : Tux Bomb de Hack.lu Introduction Pour ce challenge, l
Transcription
Challenge : Tux Bomb de Hack.lu Introduction Pour ce challenge, l
Challenge : Tux Bomb de Hack.lu Introduction Pour ce challenge, l'objectif est de fournir un username et un productkey corrects. Ceci génèrera un fichier pdf contenant les informations nécessaires pour trouver un flag (une suite de charactères qu'il faut trouver pour réussir le challenge). Pour résoudre ce problème, nous allons “patcher” l'exécutable. En reverse engineering, c'est la méthode la plus basique. Elle consiste à étudier le code désassemblé afin de déterminer les points de décision du programme, pour finalement les modifier dans le but de générer une réponse positive pour n'importe quelle paire de username et productkey. Effectivement, puisque ce logiciel demande un nom d'utilisateur et un mot de passe puis détermine s'ils sont corrects, si on est capable de trouver le résultat de la comparaison puis de le changer alors on peut modifier le programme pour qu'il donne toujours une réponse favorable. [*] Noter que plusieurs des commentaires qu'on voit sur les printscreen ont été ajoutés lors du traçage du code. Il est donc normal de ne pas les retrouver lors de votre propre désassemblage. C'est une bonne pratique de commenter le code pour s'y retrouver. Résolution 1) On commence par trouver le 'main' du programme : 2) On trouve ensuite les points d'input du username et productkey : 3) On note les trois points de décision défavorables à notre (mauvaise) réponse. Le premier détermine si le username est correct (mais sa valeur ne change rien au processus de décision); Le second détermine si le productkey est correct 4) Le troisième est un double check. Si on a juste “patché” le retour des deux checks précédents, on génèrera un fichier invalide. 5) Finalement, on peut modifier le programme pour que les trois points de décision retournent toujours vrai : 6) Et on sauve le tout sous la forme d'un exécutable “patché” : 7) On dispose maintenant du fichier PDF valide. atoi() en C++ : http://www.cplusplus.com/reference/cstdlib/atoi/ Script python (http://delogrand.blogspot.ca) : flux = 'Fluxfingers' ans = 0 for i in range(len(flux)) : ans += ord(flux[i]) print ans Soit x = 1165 Ce qui nous laisse la fonction que WA evalue a 1337 : http://www.wolframalpha.com/input/?i=1165+*+%28integral_0^infinity+exp-sqrt%28u%29+%29+ %E2%80%93+993 Calcule le hash md5 : md5("1337") = "e48e13207341b6bffb7fb1622282247b" http://www.adamek.biz/md5-generator.php Conclusion Noter qu'on aurait eu plusieurs autres options pour resoudre ce probleme : – On aurait pu comprendre les opérations arythmétiques faites sur les input de username et productkey pour vérifier leur validité puis générer des valeurs correctes; – On aurait pu comprendre le processus de remplissage du contenu du PDF pour en retirer le contenu; – On aurait pu utiliser le décompilateur disponible avec IDA Pro ou tracer le code avec un désassembleur. Toutes ces options sont bonnes, certaines sont même meilleures que celle utilisée ici, dépendemment des contraintes de temps ou du degré de compréhension du binaire à laquelle on souhaite arriver.