Solution de BuzzYbis pour Clair connu

intro crypto

12 décembre 2023

Objectif

Retrouver le flag à partir de la sortie et du code source utilisé.

Réalisation

Étape 1 : Décorticage de l’algo de chiffrement

L’objectif est de comprendre comment le code source est formé et comment notre FLAG a été chiffré.

key = os.urandom(4) * 20
c = strxor(FLAG, key[:len(FLAG)])

Ces deux lignes nous indiquent tout ce que l’on a à savoir sur comment marche notre algorithme de chiffrement.

La première ligne, crée la clé, la fonction os.random() va renvoyer 4 octets aléatoire que l’on va répéter 20 fois.

La seconde ligne, chiffre le FLAG en le xorant avec la clé tronquée à la longueur du flag (car les deux var doivent faire la même longueur pour être xoré).

Étape 2 : Récupération du flag

L’objectif premier est de retrouver la clé.

Or, on sait que la clé est composé de 4 octets répétés.

De plus, on connait les 4 premiers octets de notre flag. En effet, c’est le préfixe FCSC qui est apposé devant le flag.

On peut donc retrouver la clé, en utilisant le fait que : $$key \ \oplus \ flag \ \oplus \ flag = key$$

En utilisant cette propriété sur les 4 premiers octets on obtient les 4 octets de la clé, il ne reste qu’à les répéter.

from binascii import unhexlify
from Crypto.Util.strxor import strxor

begin_out = unhexlify("d91b7023")
begin_flag = b"FCSC"

k = strxor(begin_out, begin_flag) * 20

Ensuite on a plus qu’à xorer l’output et la clé tronquée.

output = unhexlify(open("output.txt", "r").read())

flag = strxor(k[:len(output)], output).decode()

Un print nous affiche alors notre flag : FCSC{3ebfb1b880d802cb96be0bb256f4239c27971310cdfd1842083fbe16b3a2dcf7}.