FCSC 2021 - Intro - Clair Connu
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}