1 min read

[CTF GEMA] Ransom

CTF GEMA Groupe 2025

Niveau de Difficulté : Very Easy

Catégorie du Challenge : Malware

Description :

"Je me suis absenté et j'ai laissé mon PC déverrouillé. Un de mes camarades a dû me faire une blague, car à mon retour, j'ai vu le message suivant sur mon écran :
'Tous les fichiers et dossiers ont été xoré.
Envoyez 0.04 BTC pour obtenir la clé de déchiffrement ! :)
'

Évidemment, je ne vais pas envoyer de BTC, mais je suis bloqué. Mes fichiers sont tous chiffrés et je n'ai aucune idée de la clé utilisée. Peux-tu m'aider à récupérer mes fichiers et découvrir la clé de déchiffrement ?"

Solutions Step

Nous avons l'information qu'un XOR a été appliqué. Ne connaissant pas la clé utilisée, nous allons la brute-forcer en recherchant une occurrence connue :

import os

def xor_decrypt(data, key):
    """Applique XOR avec une clé donnée."""
    return bytes([b ^ key for b in data])

def try_decrypt_file(file_path):
    """Teste toutes les clés possibles pour un fichier donné."""
    print(f"Essai de déchiffrement pour le fichier : {file_path}")
    with open(file_path, "rb") as f:
        encrypted_data = f.read()

    for key in range(256):
        decrypted_data = xor_decrypt(encrypted_data, key)
        if b"FLAG{" in decrypted_data:
            print(f"Clé trouvée pour {file_path} : {key}")
            print(f"Contenu déchiffré : {decrypted_data.decode(errors='ignore')}")
            return key

    print(f"Aucune clé trouvée pour le fichier : {file_path}")
    return None

def try_decrypt_directory(directory):
    """Tente de déchiffrer tous les fichiers dans un répertoire donné."""
    if not os.path.exists(directory):
        print(f"Le répertoire spécifié n'existe pas : {directory}")
        return
    
    for root, _, files in os.walk(directory):
        for file_name in files:
            file_path = os.path.join(root, file_name)
            try_decrypt_file(file_path)

target_directory = "./TEST"
try_decrypt_directory(target_directory)