La chute

404CTF{CONTRE_LES_CHUTES_CHERCHEZ_LES_DRAPEAUX}

Catégorie: Stegano Difficulté: medium Flag: -

Challenge

file-archive
646B
circle-info

Description


Et l'athlète s'élance, sa performance est jusqu'à présent sans fautes ! Mais, que vient-il de se passer ? Il est tombé ! J'espère qu'il n'est pas gravement blessé, car rien n'est encore joué. D'ailleurs, il essaie de nous dire quelque chose !

Mais qu'est-ce qu'il a bien pu vouloir dire ?

Solution

Un simple coup d'œil permet de faire l'hypothèse d'un chiffrement par substitution. On peut le confirmer par une analyse statistique

with open('charabia.txt', 'r', encoding='utf-8') as f:
    data = f.read().strip()

stats = {c: data.count(c) for c in set(data)}
stats = sorted(stats.items(), key=lambda x: x[1], reverse=True)
for stat in stats:
    print(stat)

# ('л', 109) ('^', 77)  ('[', 64)  ('╩', 47)
# ('#', 41)  ('&', 38)  ('λ', 35)  ('6', 33)
# ('|', 28)  ('𝚑', 26)  ('!', 26)  ('$', 23)
# ('༽', 19)  ('⃝', 17)   ('/', 16)  ('ஏ', 16)
# (':', 14)  ('я', 8)   ('é', 7)   ('Ψ', 6)
# ('ж', 6)   ('Ξ', 5)   ('%', 5)   ('ц', 5)
# ('⃥', 5)   ('▙', 5)   ('Ω', 4)   ('Σ', 4)
# ('в', 4)   ('à', 3)   ('?', 3)   ('è', 2)
# ('E', 2)   ('4', 2)   ('0', 1)   ('î', 1)
# ('-', 1)   ('{', 1)   ('}', 1)

Il y a 39 caractères différents avec une répartition non uniforme, ce qui va dans le sens de notre hypothèse. On va donc dresser une table de correspondances entre les caractères chiffrés et clairs.


Remplissage de la table

Première chose importante : aucun espace dans le texte, on peut donc supposer qu'il a été remplacé par л puisque c'est le plus présent.

Nouvel ajout à la table des correspondances

Chiffré
Correspondance

л


Ensuite, on trouve dans le texte 404[$λΣ{, on peut supposer que c'est le début du flag. Problème, il y a 4 caractères entre 404 et {, or le format du flag est 404CTF{.

Il faut cependant voir que le bigramme (terme technique pour se la péter voulant dire "groupe de deux caractères") [$ se retrouve à plusieurs endroits et surtout que le $ n'existe pas sans être précédé de [. On peut en déduire que le C correspond à ce bigramme.

Nouveaux ajouts à la table des correspondances

Chiffré
Correspondance

[$

C

λ

T

Σ

F

On va utiliser ces premiers changements pour deviner la suite, pour ça on sort notre meilleur script Python.


Dans notre nouveau texte, on peut croiser C^TT^ et T^T^, je pense que c'est assez clair, ça correspond aux mots CETTE et TETE

Nouvel ajout à la table des correspondances

Chiffré
Correspondance

^

E

On met à jour le script et on relance


Passage en mode automatique

Rien d'autre ne saute aux yeux, du moins pour ma part, donc on sort notre second outil : DCodearrow-up-right. Il permet de faire une analyse de fréquence couplée à d'autres méthodes comme l'utilisation d'indice de coïncidence.

Problème : on ne peut pas lui passer le texte avec ces caractères, donc on va refaire un petit script pour changer les caractères pas encore déchiffrés en caractères lisibles par l'outil.

On obtient

On a maintenant une très bonne base, il suffit de faire les corrections à la main. Il ne faut cependant pas oublier que des bigrammes peuvent être utilisés comme pour le C

Notamment, on voit GDANVEREUSE et GDRAPEAUT, on devine que V -> G, T -> X et GD -> D


Déchiffrement

Pour une question de simplicité, je continuerai avec le texte de base, mais en m'appuyant évidemment sur ce que DCode m'annonce.

On arrive avec le script final

Il y a quelques erreurs encore, mais le drapeau est visible et avec une correction ça donne : 404CTF{CONTRE_LES_CHUTES_CHERCHEZ_LES_DRAPEAUX}

Mis à jour