Entretien Galactique (Cryptanalyse) - 404CTF2025

Principe:
Utiliser sympy pour résoudre des équations non-linéaires

Infos (cf menu latéral):
🚩 Flaggué! +100 points gagnés — 💾 Téléchargez les fichiers du challenge
404CTF{Th3_b3st_RH_4_sur3}

Le challenge

L'énoncé du challenge

Un script

3 valeurs inconnues x y z sont prises au hasard, et on nous donne 3 équations et leur résultat
On retrouve, au passage, un easter egg d'une des éditions précédentes, où il était aussi question de théières 😃
On lance le script pour voir un peu ce qu'il se passe, et on confirme: il va nous falloir retrouver x y z à partir des 3 nombres donnés pour chaque équation

Des équations connues

Ces équations ne sont pas linéaires (on a des puissances), donc leur résolution ne sera pas triviale (pas une simple inversion de matrice)

En cherchant en ligne (ou en demandant à chatGPT), on voit qu'il s'agit d'équations connues
Précisément, on est dans le cas n = 3

Des essais…

ChatGPT?

J'ai tenté de demander à ChatGPT de résoudre ces équations, sans grande conviction puisque ce n'est clairement pas le genre de tâche où les LLM sont vraiment fiables
Si j'applique sa méthode, j'ai tout de même des résultas (décimaux, l'implé serait à corriger pour avoir des entiers)
Sauf que si j'essaie avec des valeurs que je connais (fixées d'avance à 1 2 3), la réponse n'a aucun sens!

ChatGPT n'est pas une source à utiliser pour du raisonnement.

Il est en revanche excellent en matière d'identification, voire de recherche d'image en ligne à partir d'une description.

Toutefois, l'idée y est, mais ce ne serait pas un gain de temps que d'essayer de trouver la solution avec ChatGPT: autant le faire avec des recherches en ligne classique à ce compte-là

Wolfram?

Un bon moyen de résoudre des équations, c'est WolframAlpha, mais sa réponse (juste!) n'est alors pas générique
De plus, pour une solution détaillée (qui pourrait contenir la résolution générique), je n'ai pas de licence

Sympy!

La solution la plus simple me semble donc être d'utiliser sympy, qui sait faire de la résolution d'équations (et qui, coup de bol, est déjà installé)

D'où l'intérêt de ne pas forcément faire une VM pour chaque CTF: sympy venait potentiellement d'un CTF passé, et je l'avais donc gardé sur mon poste

On pose donc les équations, et on lui demande de les résoudre avec les valeurs données par notre test précédent. Plusieurs solutions sont trouvées

Le sys me sert à éviter d'exécuter le reste de mon script Python, dans les lignes en dessous, car j'y avait d'autres étapes déjà préparées mais pas encore utilisables

On ne va garder que la première solution (un peu au pif pour le coup) et on confirme qu'elle est valide (différence == 0 avec l'attendu)

Assemblage

Il ne reste plus qu'à lire/écrire dans le socket du challenge (avec quelques print de débug) et on flag!

Contrairement à 2022, j'ai préféré flagguer plus souvent via Python cette année. C'est quand même souvent plus simple, surtout pour les entrées/sorties réseau, qui étaient parfois laborieuses sur PHP 😄

Flag: 404CTF{Th3_b3st_RH_4_sur3}