Contexte
Le programme integration-par-parties.py charge la classe SharedValue du module shared_value pour effectuer un traitement sur le contenu du fichier flag.bin.
Les fonctions de la classe ShardValue utilisées sont init, set, refresh et export.
Il y a un exemple d’utilisation de la classe SharedValue dans le fichier shared_value.py avec notamment l’utilisation de la fonction randomize
Le programme integration-par-parties.py n’utilise pas la fonction randomize. Cela fragilise t’il le traitement ?
Analyse
La fonction init crée une liste d’entiers avec order+1 éléments (order = 32). Chaque élément est initialisé à 0.
Après avoir appellé la fonction set, le dernier élément de la liste a pour valeur le contenu du fichier flag.bin convertit en entier.
| Element | Valeur |
|---|---|
| element_1 | 0 |
| element_2 | 0 |
| element_3 | 0 |
| … | … |
| element_order | 0 |
| element_order+1 | flag |
La fonction refresh a pour but de randomiser la liste d’entiers. A la fin de cette fonction les éléments de la liste ont les valeurs suivantes:
| Element | Valeur |
|---|---|
| element_1 | $\color{red}{\textsf{rand0-1}}$ ^ $\color{green}{\textsf{rand0-2}}$ ^ $\color{blue}{\textsf{rand0-3}}$ ^ … ^ $\color{teal}{\textsf{rand0-order-1}}$ ^ $\color{lime}{\textsf{rand0-order}}$ |
| element_2 | $\color{red}{\textsf{rand0-1}}$ ^ $\color{orange}{\textsf{rand1-2}}$ ^ $\color{sienna}{\textsf{rand1-3}}$ ^ … ^ $\color{magenta}{\textsf{rand1-order-1}}$ ^ $\color{pink}{\textsf{rand1-order}}$ |
| element_3 | $\color{green}{\textsf{rand0-2}}$ ^ $\color{orange}{\textsf{rand1-2}}$ ^ $\color{navy}{\textsf{rand2-3}}$ ^ … ^ $\color{skyblue}{\textsf{rand2-order-1}}$ ^ $\color{yellow}{\textsf{rand2-order}}$ |
| element_4 | $\color{blue}{\textsf{rand0-3}}$ ^ $\color{sienna}{\textsf{rand1-3}}$ ^ $\color{navy}{\textsf{rand2-3}}$ ^ … |
| … | … |
| element_order | $\color{teal}{\textsf{rand0-order-1}}$ ^ $\color{magenta}{\textsf{rand1-order-1}}$ ^ $\color{skyblue}{\textsf{rand2-order-1}}$ ^ … ^ $\color{purple}{\textsf{rand-order-1-order}}$ |
| element_order+1 | $\color{lime}{\textsf{rand0-order}}$ ^ $\color{pink}{\textsf{rand1-order}}$ ^ $\color{yellow}{\textsf{rand2-order}}$ ^ … ^ $\color{purple}{\textsf{rand-order-1-order}}$ ^ flag |
Défaut
L’opérateur xor ^ a la propriété value ^ value = 0 et on voit que chaque valeur tirée au hasard apparait sur 2 éléments. On peut donc supprimer toutes ces valeurs en doublon par une fonction xor entre tous les éléments de la liste. La valeur restante à la fin sera le flag qu’il suffit de convertir en hexa et ensuite en chaîne de caractères.
Solution
import json
f = open('output.txt')
d = json.load(f)
x=0
for i in d:
x ^= i
print("Flag: FCSC{" + str(hex(x))[2:] + "}")
$ python3 decrypt_flag.py
Flag: FCSC{9d32625a5f1365498854445f129406bbff2835f41db66361263396fef2de7681}