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}
.