FCSC 2021 - Intro - Clair Connu

Table des matières :

Votre but est de déchiffrer le flag.

Fichiers joints :

Résolution

Tout d’abord, analysons le script fourni clair-connu.py, ayant permis de chiffrer le flag.

import os
from Crypto.Util.number import long_to_bytes
from Crypto.Util.strxor import strxor

FLAG = open("flag.txt", "rb").read()

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

Le chiffrement utilisé ici est un simple XOR avec une clé de 4 bytes de long, répétée plusieurs fois pour atteindre la longueur du flag à chiffrer. Nous savons que le chiffrement XOR est involutif, c’est à dire :

    c = a (+) b
<=> a (+) c = a (+) a (+) b
<=> a (+) c = b

De même que :

    c = a (+) b
<=> c (+) b = a (+) b (+) b
<=> c (+) b = a

Il suffit donc de connaitre deux éléments de notre équation pour retrouver le troisième. Ici nous ne connaissons pas le flag … et pourtant nous en savons assez ! Nous savons que le flag commence par FCSC{, et que la clé utilisée est de 4 bytes. Donc si nous effectuons un XOR des 4 premiers bytes du flag chiffré avec la chaîne FCSC nous obtiendrons la clé ! Il suffit ensuite de réaliser un XOR de cette clé obtenue sur toute la longueur du flag chiffré pour le déchiffrer !

Nous pouvons faire ça très simplement en python :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from Crypto.Util.strxor import strxor
import binascii

FLAG = "d91b7023e46b4602f93a1202a7601304a7681103fd611502fa684102ad6d1506ab6a1059fc6a1459a8691051af3b4706fb691b54ad681b53f93a4651a93a1001ad3c4006a825"
FLAG = binascii.unhexlify(FLAG)

key = strxor(FLAG[:4], b'FCSC')
print("[+] key :",key)
plaintext = strxor(FLAG, (key * 20)[:len(FLAG)])
print(plaintext)

Et nous obtenons le flag :

FCSC{3ebfb1b880d802cb96be0bb256f4239c27971310cdfd1842083fbe16b3a2dcf7}