Solution de cyphertux pour babyfuscation

reverse

2 janvier 2026

📋 Description

Analyse et résolution d’un binaire ELF Linux obfusqué utilisant des transformations de bits (rotations circulaires + XOR).

📁 Contenu

.
├── README.md                  # Ce fichier
├── babyfuscation_writeup.md   # Write-up complet et détaillé
├── solve.py                   # Script de résolution Python
└── babyfuscation              # Binaire original (non inclus)

🔍 Méthodologie

1. Analyse statique

  • Décompilation avec Dogbolt
  • Identification de l’algorithme de transformation
  • Extraction du tableau cible

2. Algorithme identifié

for (int i = 0; i < len; i++) {
    output[i] = ((input[i] << 3) | (input[i] >> 5)) ^ (3 * i + 31);
}

Transformation:

  • Rotation circulaire de 3 bits à gauche
  • XOR avec clé variable basée sur la position

3. Résolution

Bruteforce de chaque position (95 caractères ASCII à tester) pour inverser la transformation.

Solver

#!/usr/bin/env python3
"""
FCSC - Baby Fuscation - Solver
Author: Cyphertux
Date: 2026-01-02

Ce script inverse l'algorithme de transformation du binaire babyfuscation
pour retrouver le flag original.
"""

def solve():
    # Tableau cible extrait du binaire (jMunhwoW4bRqeCdJfXvfNrRm)
    target = [
        45, 56, -65, 50, -16, 5, -88, -75, 4, -101, -116, 83,
        -54, -25, -16, 103, -10, 89, -60, -15, 80, -25, 122, -91,
        116, -85, -36, -39, 80, -9, 90, -67, -74, 43, -98, 49,
        -112, 55, 8, 29, 62, -87, 44, 105, 10, 103, 56, -97,
        14, 43, 36, -109, 114, 31, 64, 109, -44, 123, -18, 81,
        26, 79, -54, 109, -20, -15, 36, -53, 114, 5, -15
    ]

    # Conversion des entiers signés en unsigned bytes (0-255)
    target = [(x & 0xFF) for x in target]

    print("[*] Démarrage du bruteforce...")
    print(f"[*] Taille du tableau cible: {len(target)} bytes")
    print()

    flag = []

    # Pour chaque position dans le tableau
    for i in range(len(target)):
        found = False

        # Tester tous les caractères ASCII imprimables (32-126)
        for c in range(32, 127):
            # Appliquer la transformation du binaire:
            # output[i] = ((input[i] << 3) | (input[i] >> 5)) ^ (3 * i + 31)

            # Étape 1: Rotation circulaire de 3 bits à gauche
            rotated = ((c << 3) | (c >> 5)) & 0xFF

            # Étape 2: XOR avec clé variable selon la position
            transformed = rotated ^ ((3 * i + 31) & 0xFF)

            # Vérifier si ça correspond à la valeur cible
            if transformed == target[i]:
                flag.append(chr(c))
                found = True
                break

        if not found:
            print(f"[!] Aucun caractère trouvé pour la position {i}")
            flag.append('?')

    # Assembler et afficher le flag
    result = ''.join(flag)

    print("[+] Flag trouvé!")
    print()
    print("=" * 80)
    print(f"Flag: {result}")
    print("=" * 80)
    print()

    return result


if __name__ == "__main__":
    print("""
╔═══════════════════════════════════════════════════════════════════════════╗
║                 FCSC - Baby Fuscation - Solver                            ║
║                      Reverse Engineering                                  ║
╚═══════════════════════════════════════════════════════════════════════════╝
    """)

    flag = solve()

    # Vérification basique
    if flag.startswith("FCSC{") and flag.endswith("}"):
        print("[✓] Le flag a le bon format!")
    else:
        print("[!] Attention: le format du flag semble incorrect")