Writeup Unknown 2 | GrabCon 2021 | Catégorie reverse
Unknown 2 | GrabCon CTF 2021
Fichier(s)
Nécessaires
Ghidra + Kali
Flag
GrabCON{626C61636B647261676F6E}
Solution détaillée
La première chose que j’ai fait et de faire un ltrace
mais cela n’a rien donné
J’ai donc fait : strings med_re_2
et en cherchant un petit peu j’ai trouvé ceci :
Si vous ne connaissez pas,UPX est un packer qui ici compresse le binaire . Nativement, le fichier ne peut pas être analysé avec ghidra .
Après quelques recherches, on trouve cette commande pour unpack le .exe :
Retournons sur Ghidra :
Maintenant cherchons dans le main
On trouve 2 fonctions intéressantes : main.main et main.one
Regardons d’abord main.main :
Nous voyons de l’ascii art, c’est donc la fonction qui doit être chargée au lancement du binaire. Exécutons-le :
Si on regarde le code du main.main
, en bas nous retrouvons :
Prinln()
Je suppose donc que le if n’est pas vérifié et que donc main.one()
n’est pas appelée.
Nous devons donc accéder à cette fonction. Je ne sais pas si c’est la méthode la plus propre pour faire ceci mais j’ai modifié le binaire :
J’ai transformé == en != comme ceci . En assembleur, on sait que == géré par l’instruction JZ ou JNZ, En cliquant sur la condition on peut patch en remplaçant JNZ par JZ (== par !=)
Trouver JZ en bas du menu et pressez Enter
Il faut maintenant exporter votre nouveau binaire :
“File” -> “Export program” -> Format : ELF et Output : med_re_2_patch1 -> “Enter”
Maintenant exécutons notre nouveau binaire :
Ça devient intéressant ! On nous demande un mot de passe. Cherchons donc du côté du main.one La fonction semble complexe mais nous cherchons uniquement les “PrintLn” et les conditions. Voici ce qui m’a interpellé :
Nous avons une condition et un PrintLn() , D’après le résultat du binaire patché , je suppose que c’est là que le flag est caché :
Nous voulons que la condition soit vérifiée : if (local_40 == 0x195)
(ligne 192)
De la même manière que la patch précédent, changeons la condition (JNZ → JZ) puis exportons le nouveau patch
Exécutons celui-ci :
Voila ! Afficher une string sous une certaine condition est assez simple à modifier !