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 faite est 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 == est 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 le patch précédent, changeons la condition (JNZ → JZ) puis exportons le nouveau patch

Exécutons celui-ci :

Voilà ! Afficher une string sous une certaine condition est assez simple à modifier !