FCSC 2020 - Writeups

J’ai eu la chance de participer la semaine dernière aux qualifications pour l’équipe de France de CTF, organisées par l’ANSSI. Les challenges étaient agréables, malgré une pression de devoir se classer parmi les 15 meilleurs pour accéder à la finale.

J’ai écrit 5 writeups complets, choisis suite à un sondage que j’ai lancé auprès des autres joueurs.

img

Writeups

Mazopotamia - Misc 200

SSEcret - Reverse 500

Slowppiness - Reverse 200

Le Rustique - Misc 200

Quarantaine - Hardware 50

Bullet Writeups

Malheureusement, les organisateurs du challenge ont souhaité recevoir tous les writeups avant la fin du CTF, alors que j’aurais souhaité en publier bien plus. Voici donc une série de writeups “expérimentaux” très courts :

Randomito - Misc 50

Tout prête à croire qu’il faudra faire de la prédiction de générateur de nombres aléatoires, mais ce n’est que tromperie : le programme est interprété en python 2, et la fonction input() est utilisée (équivalente à eval(raw_input())), ce qui pose un risaue de sécurité et nous permet de passer des noms de variables au lieu d’entiers.

Baby XNP - Misc 200

On attend avec impatience le writeup de SIben qui a été le seul à flagger la version complète pour N=16. Ma solution pour le baby (N=5) était basée sur un algo de recherche Meet in the Middle.

Chapardeur de mots de passe - Forensics 200

Comme indiqué dans l’énoncé, le pcap contient une exfiltration par un malware KPOT 2.0. Le souci est que l’on ne dispose pas de l’exécutable donc on ne peut pas récupérer la clé XOR hardcodée. Cela ne pose aucun souci car la clé est courte, on peut utiliser un outil comme xortool ou le faire à la main (astuce : les payloads KPOT 2.0 se terminent toujours par __DELIMM____DELIMM____DELIMM__, qui est plus long que la clé donc nous permet de la reconstituer intégralement sans tâtonner). On pouvait aussi utiliser l’outil Magic du CyberChef.

Macaron - Crypto 200

L’algorithme calcule le HMAC de paires de blocs consécutifs de 16 octets, puis calcule un token correspondant au xor de tous ces blocs.

En remplaçant un bloc par 3 copies de lui-même, le token résultant est identique alors que le message est différent : token([bloc1] [bloc2]) == token([bloc1] [bloc1] [bloc1] [bloc2]).

Deterministic ECDSA - Crypto 50

Normalement, l’algorithme ECDSA utilise un nombre aléatoire k que l’utilisateur ne connaît pas. Ici, k est prédictible et l’on peut donc recalculer la clé secrète afin de signer nos propres messages.

Keykoolol - Reverse 500

Une VM classique avec une trentaine d’opcodes différents et 256 instructions dans le code de la VM. J’ai écrit un beau désassembleur custom en Python puis fait tout le reverse à la main (mais le writeup complet aurait pris trop de temps à écrire, sorry !)

Une spécificité de ce challenge, la VM déchiffre parfois son propre code avant de l’exécuter.

La VM comporte 4 fonctions :

  • parsing du serial (conversion de chaîne hexa à bytes)
  • calcul du hash de l’username
  • chiffrement du serial avec des opérations élémentaires AES
  • comparaison du serial chiffré et du hash de l’username

Il fallait donc calculer le hash du nom d’utilisateur fourni, puis effectuer les opérations de chiffrement inversées pour récupérer un serial valide.

Written on May 4, 2020
Follow us on Twitter to be informed about new posts !