Table des matières
📋 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")