T-Rex (Crypto) - FCSC 2022

T-Rex (Crypto) - FCSC 2022

Fichiers du challenge Principe:
Résoudre une équation polynomial modulaire 31337 fois (via Sage) pour retrouver une clef AES

Le challenge

Le challenge nous donne un algo de chiffrement Python, le flag chiffré (dispo ici) , et à nous de le déchiffrer

Principe

L'algo de chiffrement

L'algo prend un valeur aléatoire (os.urandom) qui servira de clef de chiffrement. Puis, il construit un IV de chiffrement en dérivant cette valeur aléatoire 31337 fois. Enfin, il chiffre le flag avec la clef aléatoire et l'IV dérivé 31337 fois.

On nous donne la valeur d'IV du flag, il faut donc remonter jusqu'à la key aléatoire originale

Inversion de l'IV

Inverser 1 itération implique de résoudre l'équation IV_n+1 = (2*IV_n+1)*IV_n % M
On cherche donc, en ligne, comment résoudre cette équation

Bien que j'ai utilisé Sage pour résoudre d'autres challenges, je ne l'avais pas encore utilisé à ce moment-là et j'ignorai donc qu'il était la méthode à employer.

WolframAlpha

J'ai envisagé d'utiliser WolframAlpha, qui savait résoudre le problème, mais le nombre de requêtes est limité: 31337 aurait fait sauter la limite gratuite
Chose amusante, avec (3*x+1)*x, Wolfram n'a pas de solution: l'équation n'a pas été choisie au hasard

cocalc

Je suis alors tombé sur cocalc qui permet de résoudre ce genre d'équations (c'est un "Sage online")
Mais le nombre de messages est limité: si j'affiche la valeur antécédente de IV à chaque itération, je serai bloqué

Quand un gros calcul doit être fait, afficher les résultat intermédiaires permet de limiter le risque de perte de temps en cas de crash du calcul. Je le fais donc quasi systématiquement

J'ai donc commencé à réitérer la résolution via cocalc, en copiant/collant les valeurs, puis en refaisant le calcul avec le dernier antécédant affiché (c'est long!)
En plus, le calcul crashait régulièrement, et nécessitait de redémarrer le projet…

Sage

Je suis alors tombé sur Sage que j'ai installé
Python plantait alors j'ai essayé Sage windows, via Wine
Le calcul était long sur mon PC… je l'ai donc lancé sur le Windows du travail après avoir installé Sage (car la machine de taff est plus puissante)
J'ai pas trouvé de solution pour installer les paquets python manquant
J'ai cru que Sage n'utilisait pas la même version de Python que ma ligne de commande, mais non, la version était bien la même
Et après du pif et du chocolat, j'ai vu que le PATH diffère, et que /home/dragon/.local manquait, ce qui aurait expliqué le fait que Sage ne trouve pas certains import
Du coup, j'ai installé le paquet Python manquant en sudo pour qu'il soit dans un répertoire global et non dans mon home .local
Et cela marche enfin! Sage remonte chaque itération de l'IV et retrouve la clef originale (de mon test)

Livraison

On refait la même chose avec l'IV du challenge, et on laisse calculer
J'ai lancé le calcul sur mon PC de taff, 5 fois plus rapide que mon PC portable perso
Le Windows a terminé en premier, mon Linux moulinait encore
On a alors la clef originale de chiffrement AES (et l'IV, et l'encrypted)
On vérifie le résultat en re-dérivant la clef trouvée et en vérifiant qu'on retombe sur le bon IV (en hexa)

Déchiffrement

On déchiffre le message encrypted en AES avec key et IV, et poof, flag:
FCSC{54a680c151c2bff32fd2fdc12b4f8558012dc71e429f075bab6bfc0322354bf4}

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil