Shuffled

shuffled

Dans ce challenge, nous avons 2 fichiers :

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

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}
cat