Hackllebarde Ransomware 4/4 (Cryptanalyse) - 404CTF 2022

Hackllebarde Ransomware 4/4 (Cryptanalyse) - 404CTF 2022

Fichiers du challenge Principe:
Brute-forcer la seed d'un 'rand()' pour reproduire les mêmes valeurs de la suite aléatoire (non-crypto safe) et s'en servir pour déchiffrer un PDF donnant le flag

Le challenge

A partir des sources d'un programme de chiffrement (dispo ici) , on doit retrouver la clef et déchiffrer le flag

Un chiffrement "random"

D'après la source en C fournie, une seed est choisie au hasard et sert à générer des valeurs aléatoires qui permettent ensuite de chiffrer le document (que l'on doit déchiffrer). Comme cette fonction aléatoire n'est pas crypto-safe, elle est répétable (à partir de sa seed). On va donc essayer de retrouver cette seed

Testons

D'après le nom du fichier flag.pdf.enc, le document original est un PDF: on va donc se faire un jeu de test (pour trouver la méthode de déchiffrement) avec un PDF

On dérive la source originale pour fixer une seed arbitraire (424242) et on chiffre un document de test

Notre but va ensuite d'être de retrouver cette seed et de déchiffrer notre document de test

Comme on connait le début du fichier qu'on a chiffré (un PDF), on teste toutes les seeds jusqu'à ce que les premiers caractères soient corrects

Cette méthode marche car le début d'un PDF est toujours %PDF (la version, ensuite, peut différer). S'il n'y avait pas eu ce "magic number", il aurait fallut trouver une autre marqueur constant pour valider notre seed brute-forcée (un IEND à X bytes de la fin du fichier par exemple)

Mais… ça foire! Je me suis alors dit "comme je code peu en C, j'ai peut-être fait une erreur?"
A coups de print, je m'aperçois alors qu'il fallait caster les bytes du magic number en char: ça marche!

Le brute-forceur nous renvoie ici deux candidats, qui sont en fait le même 424242 au signe près (2**31 - 2147059406 = 424242)

On crée alors un code C pour déchiffrer le fichier, en utilisant la seed trouvée (en pratique, les deux marchent, puisqu'elles sont le même int32)

Le vrai fichier

On applique le même brute-forceur de seed au fichier d'origine, et on trouve 270701183

Je n'ai pas trouvé de logique à cette seed (je m'attendais à un 13374242 ou un truc du genre)

On l'utilise dans notre code de déchiffrerment et on obtient un PDF valide
On l'ouvre, et wow, ça faisait longtemps que je n'avais pas vu du "Wordart"!

Flag

On recopie le flag à la main vu qu'il s'agit d'une image d'un Wordart, et on le valide:
404CTF{W0w_p4s_Tr3S_r4nD0m_T0ut_c4}

Oui, ca ne sert à rien, mais je me suis quand même amusé à reproduire le même "Wordart" dans libreoffice (ou un truc similaire en tous cas)!

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil