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 !