Principe:
Ré-ordonner les caractères d'un flag en retrouvant la seed originelle et la bijection associée
Le challenge
On procèdera en deux temps: on va d'abord retrouver la seed utilisée, puis on va retrouver l'ordre des caractères après mélange utilisant cette seed.
Trouver la seed
Dans
les fichiers du challenge (dispo ici)
,
on voir que le flag a été mélangé via random.seed() puis random.shuffled(flag).
On va donc créer un faux flag
FCSC{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
que l'on mélangera avec toutes les seeds possibles (256 valeurs).
On comparera alors la sortie au flag
f668cf029d2dc4234394e3f7a8S9f15f626Cc257Ce64}2dcd93323933d2{F1a1cd29db
donné par le challenge.
Les seeds possibles seront toutes celles pour lesquelles les caractères-clef FCSC{}
seront correctement placés.
Remonter au flag
Maintenant qu'on a la seed, on va refaire la même chose mais en utilisant un faux-flag dans lequel chaque caractère sera différent. On pourra alors inverser le shuffle:
La méthode marche car on a pu construire un flag dont chaque caractère est unique. Si le flag avait été plus long (plus de 256 caractères), on aurait été coincé.