Solution de benoitlab pour Intégration par parties

intro hardware attaque side channel

26 janvier 2025

Table des matières

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}