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.
Faux-flag:
FCSC{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
Résultat après shuffle (seed 125):
xxxxxxxxxxxxxxxxxxxxxxxxxxSxxxxxxxxCxxxxCxxx}xxxxxxxxxxxxxx{Fxxxxxxxxx
Flag donné par le challenge:
f668cf029d2dc4234394e3f7a8S9f15f626Cc257Ce64}2dcd93323933d2{F1a1cd29db
La seed est donc 125 puisque la position des caractères-clef correspond:
__________________________S________C____C___}______________{F_________
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:
Faux-flag unique:
FCSC{0123456789abcdefghijklmnopqrstuvwxyzABDEGHIJKLMNOPQRTUVWXYZ.:/!?}
Résultat après shuffle (125):
jgvMAPYs/0?3.Wh2QwOKauIf97SoHk8LVUDCmt!cCR:6}5dbJ1TlNBrp4XG{FzZyeEixnq
Flag donné par le challenge:
f668cf029d2dc4234394e3f7a8S9f15f626Cc257Ce64}2dcd93323933d2{F1a1cd29db
Donc, le "j" du faux-flag original doit être remplacé par un "f" du flag réel
le "g" par un "6", le v par un "6", le "M" par un "8", etc
Flag original:
FCSC{d93d32485aec7dc7622f13cd93b922363911c36d2ffd4f829f4e3264d0ac6952}
FCSC{d93d32485aec7dc7622f13cd93b922363911c36d2ffd4f829f4e3264d0ac6952}
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é.