Prechall - FCSC 2022

Prechall - FCSC 2022

Fichiers du challenge Principe:
Un challenge en deux étapes pour "s'échauffer": la première consiste à déchiffrer un texte caché dans une image qui mène à une URL et la seconde est un programme de TI83+ servant à valider le flag

Prechall — FCSC2022

Caché dans une image

Le challenge commence avant que le FCSC2022 n'ouvre: "un premier flag est à trouver sur ce site"
On cherche dans le code source de la page, et on trouve que le logo FCSC s'appelle "stegano":
il contient sûrement quelque chose

Stégano? Vraiment?

Après avoir téléchargé le logo (disponible ici) , j'ai regardé les meta données: un lien? La suite du challenge?
…eh... non ! :)

C'est sûrement de la stégano

Retour au logo. En l'observant bien, on voit des "barbules" sur le titre en rouge
…qui ressortent mieux une fois zoomé

J'ai donc cherché, pendant bien 30 minutes à 1h, un logiciel de stégano qui aurait trouvé quelque chose… Aucun n'a marché. J'ai failli abandonner, jusqu'à, par hasard, tenter complètement autre chose

Un simple contraste

En boostant le constraste et en jouant avec la luminosité, un élément caché apparait dans le logo: des dinosaures!

Je pensais d'abord essayer d'associer chaque dino à 1 lettre, puis tester toutes les combinaisons de lettres possibles. Puis je me suis dit "les créateurs du challenge n'ont sûrement pas copié/collé des images de dino à la main: il existe peut-etre simplement une police 'dinosaures'?"

En cherchant "font dinosaur" sur internet, je suis tombé sur "Ding-o-saurs Font", qui semble correspondre
Et c'est parti: à la main, il faut faire correspondre les dinos de l'image du FCSC aux dinos de la font, ce qui permet de savoir quelle lettre ils représentent.

Comme on le voit, j'ai mis des "marqueurs" en noir sur l'image, pour découper arbitrairement le texte. Cela me permet de plus facilement faire les correspondances, "bloc par bloc".

1 1 WKSMGMGHI 1 2 MOQOYJO 1 3 PSIIOKVS 1 4 PKODLOKO 1 5 OUSPO 2 1 JOZOZCS 2 2 VVOQBO 2 3 MGHI 2 4 UKGHMOKOY 2 5 VSNLQS 2 6 ZOUUO 3 1 SJKOIIO 3 2 CUUPI://N 3 3 KSQZO-ZT 3 4 WOKI 3 5 OZHKLUT- 4 1 ZCSVVO 4 2 QBO.NK/W 4 3 PWZDKPVNBYD 4 4 YUBBBPWZ
Le texte résultant du déchiffrement manuel: en 1, la ligne, en 2, le numéro de "bloc" (traits noirs) et en 3e colonne, le texte déchiffré
WKSMGMGHIMOQOYJOPSIIOKVSPKODLOKOOUSPOJOZOZCSVVOQBOMGHIUKGHMOKOYVSNLQSZOUUOSJKOIIOCUUPI://NKSQZO-ZTWOKIOZHKLUT-ZCSVVOQBO.NK/WPWZDKPVNBYDYUBBBPWZ
On remet le texte en un bloc… Ca ne veut rien dire, mais on repère ://, le texte contient donc sûrement une URI

Déchiffrement: Dcode

dcode nous permet d'essayer de déchiffrer le texte automatiquement
Le résultat n'est pas parfait…
Mais on peut deviner certains mots (BRAVO)
Ainsi que des patterns: CUUPI devrait devenir HTTPS, puisqu'il y a une URL, et comme le FCSC utilise probablement un seul nom de domaine, NKSQZO-ZTWOKIOZHKLUT-ZCSVVOQBO.NK devrait devenir FRANCE-CYBERSECURITY-CHALLENGE.FR
WKSMG MGHI MOQOY JO PSIIOK VS PKODLOKO OUSPO JO ZO ZCSVVOQBO MGHI UKGHMOKOY VS NLQ S ZOUUO SJKOIIO BRAVO VOUS VENEZ DE PASSER LA PREMIERE ETAPE DE CE CHALLENGE VOUS TROUVEREZ LA FIN A CETTE ADRESSE CUUPI://NKSQZO-ZTWOKIOZHKLUT-ZCSVVOQBO.NK/WPWZDKPVNBYDYUBBBPWZ HTTPS://FRANCE-CYBERSECURITY-CHALLENGE.FR/BPBCMRPLFGZMZTGGGPBC
On retrouve le texte original (substition de lettres)
La page à laquelle mène cette première partie

La TI83+

Emulateur

Le fichier est un programme de TI83+ (dispo ici)
Son contenu n'est pas directement lisible, donc, je pars sur la recherche d'un émulateur (n'ayant pu trouver un décompilateur potable)
On installe l'émulateur (Wabbit), et une ROM associée (je vous laisse trouver sur le net)
On le lance: ça marche (c'est déjà bien)
On charge le programme du FCSC dans l'émulateur, pour pouvoir ensuite le lancer
On galère un peu avec la syntaxe pour le lancer: 2nd + Catalog puis Asm(, puis Prgm, et on sélectionne le FCSC

Si on tente de lancer le programme via "Prgm", une erreur apparait. En la cherchant sur internet, on trouve la solution (la syntaxe ci-dessus) fournie sur le site de Texas Instrument.

Le programme se lance :)

Modifier le code et rusher

Le programme demande une entrée de 32 caractères: le flag?
On repère un pattern dans le programme (INC, XOR, CP, JR, CALL) qui semble vérifier l'entrée utilisateur caractère par caractère
Dans un éditeur hexadécimal, on peut mettre des NOP (0x00) pour supprimer les tests, dans l'espoir d'atteindre le flag contenu dans le programme
On entre n'importe quoi, et… perdu!
En mettant les NOP de manière plus subtile, pour prendre les bons jumps…
…puis en entrant n'importe quoi, on s'aperçoit que le flag est en fait l'entrée de l'utilisateur

Comme d'autres flags, celui-ci n'est donc pas contenu dans le programme (de la TI), mais est l'entrée à donner au programme (non modifié) pour atteindre le "Bravo!"

Reverse engineer? ou brute-force?

J'ai finalement mis un point d'arrêt sur chaque jump, et testé les 16 possibilités de la première lettre, jusqu'à trouver celle pour laquelle le jump est pris

Il y a sûrement plus subtil, mais je n'ai pas réussi à faire le reverse-engineering propre du programme

Passer par le débugger était long… J'ai donc finalement modifié de nouveau le programme, pour rajouter les NOP permettant d'atteindre le "Bravo". Puis, j'ai remis le code du premier JUMP, et deviné lettre par lettre!

Quand la première lettre est trouvée (et grâce aux NOP partout sauf sur le premier JUMP), le "bravo" est atteind. Cela me permet de savoir que ma 1ere lettre est la bonne.

On n'oublie alors pas de remettre le code du 2nd JUMP, et on recommence pour la seconde lettre, en conservant la première, qui est valide.

On continue…
Et on finit par trouver l'entrée complète
Et on confirme en utilisant cette même entrée dans le programme original

Je vous recommande de toujours garder une copie de ce que vous téléchargez pendant un CTF: cela vous permet de revenir dessus pour tester vos réponses, sans risquer de la tester avec un programme modifié!

Et c'est gagné! FCSC{4B8CB9E0ADB7F2B3BA4E6CB7156F1243}

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil