
Dans ce challenge, nous avons 2 fichiers :
output.txt
qui contient une chaîne de caractères de manière désordonnéeshuffled.py
qui contient le code qui a permis de mélanger la chaîne de caractères
Le but étant de retrouver le flag qui a été mélangé dans output.txt
Lecture du script
shuffled.py
contient le code suivant
import random
flag = list(open("flag.txt", "rb").read().strip())
random.seed(random.randint(0, 256))
random.shuffle(flag)
print(bytes(flag).decode())
Explications
- Import de la librairie
random
- Lecture du fichier
flag.txt
en enlevant les retours chariots (caractère\n
notamment) - On initialise un nombre entier aléatoire entre 0 et 256
- On mélange la chaîne de caractères contenue dans
flag.txt
- On affiche cette nouvelle chaîne de caractères désordonnée
Le résultat dans notre cas (contenue dans output.txt
) est :
f668cf029d2dc4234394e3f7a8S9f15f626Cc257Ce64}2dcd93323933d2{F1a1cd29db
Le but de ce challenge est donc de retrouver la chaîne de caractères initiale.
Remettons donc cette chaîne dans le bon ordre, voulez-vous.
Mettons de l'ordre dans tout ça
Nous allons donc écrire un script Python pour revenir à la chaîne originale.
import random
output = list(open("output.txt", "rb").read().strip())
for i in range(256):
output_len = len(output)
# Creation d'une liste de position
position_list = list(range(1, output_len + 1))
# seed + shuffle à chaque itération pur obtenir la liste des décallages de potitions
random.seed(i)
random.shuffle(position_list)
# Creation d'une liste de tuple valeur/position entre la liste initiale et les position mélangées
tupled_list = list(zip(output, position_list))
# On tri par position pour essayer de retrouver le flag initial
tupled_list.sort(key=lambda x: x[1])
final_list = list()
# On reconstruit une liste avec uniquement les valeurs sans les positions
for (value, position) in tupled_list:
final_list.append(value)
flag = bytes(final_list).decode()
if "FCSC{" in flag:
print(flag)
Au risque de paraphraser les commentaires dans le code, je vais dérouler l'algorithme de ce script.
- On importe la librairie
random
- On récupère la chaîne de caractères mélangée dans
output.txt
- Étant donné que le script
shuffled.py
génère un nombre aléatoire entre 0 et 256, nous allons créer une boucle allant de 0 à 256 pour tester les combinaisons jusqu'à retrouver la chaîne ordonnée - On récupère la longueur de la chaîne contenue dans
output.txt
- On créé une liste de 1 à la longueur + 1 de la chaîne de caractères qui va représenter les positions des caractères
- On initialise le générateur de nombre aléatoire avec la valeur de l'itération contenue dans la variable
i
- On mélange notre liste de position
position_list
- On crée une liste contenant des tuples de 2 éléments avec :
- Le caractère courant de la chaîne
- La position du caractère courant de la chaîne
- Par exemple
[('f',4),('6',2),('6',1),('8',0),('c',3) ....etc ]
- On trie la liste par position dans l'ordre pour remettre les caractères dans le bon ordre, par exemple
[('8',0),('6',1),('6',2),('c',3),('f',4) ....etc ]
- On crée une nouvelle liste vide
- Dans la boucle
for (value, position) in tupled_list:
, on extrait les caractères des tuples. Par exemple['8','6','6','c','f' .... etc ]
- On récupère une chaîne de caractères depuis la liste ordonnée
- Si la chaîne commence par
FCSC{
(le début du flag), c'est qu'on a la bonne chaîne de caractères ordonnée et on l'écrit.
Résultat de l'exécution du script
FCSC{d93d32485aec7dc7622f13cd93b922363911c36d2ffd4f829f4e3264d0ac6952}
