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}