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 :

Alt text

Si vous ne connaissez pas, UPX est un packer qui ici compresse le binaire. Nativement, le fichier ne peut pas être analysé avec ghidra.

Alt text

Après quelques recherches, on trouve cette commande pour unpack le .exe :

Alt text

Retournons sur Ghidra :

Alt text

Maintenant cherchons dans le main On trouve 2 fonctions intéressantes : main.main et main.one Regardons d’abord main.main :

Alt text

Nous voyons de l’ascii art, c’est donc la fonction qui doit être chargée au lancement du binaire. Exécutons-le :

Alt text

Si on regarde le code du main.main, en bas nous retrouvons :

C
Prinln()

Alt text

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 !=)

Alt text

Alt text

Alt text

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 :

Alt text

Ç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é :

Alt text

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é :

Alt text

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

Alt text

Exécutons celui-ci :

Alt text

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