writeup

404 CTF writeup - Dur à CERNer

25/05/2026 Mis à jour le 12/06/2026


Analyse du code du défi

On doit tout d'abord télécharger le code exemple du défis afin de l'analyser

code source python

Code à analyser ci-dessous.

import os
import hashlib

def logo():
  print("Logo cern")

def accélérateur_de_particules(particule_a : str, particule_b : str) -> bool:
  sha256 = hashlib.sha256()
  sha256.update(bytes.fromhex(particule_a))
  position_particule_a = sha256.digest()

  sha256 = hashlib.sha256()
  sha256.update(bytes.fromhex(particule_b))
  position_particule_b = sha256.digest()

  return position_particule_a == position_particule_b

if __name__ == "__main__":
  logo()

  print("Bienvenue au CERN ! Veuillez entrer les coordonnées de départ de deux particules et nous tenterons de les faire entrer en collision")
  print("Position de la première particule (format hexadecimal) : ")
  print("> ", end="")
  particule_a = input()

  print("Position de la deuxième particule (format hexadecimal) : ")
  print("> ", end="")
  particule_b = input()

  if particule_a == particule_b:
    print("Une seule particule ne peut pas produire de collisions !")
    exit(1)

  try:
    resultat = accélérateur_de_particules(particule_a, particule_b)
  except ValueError:
    print("Il semblerait qu'il y ait eu une erreur dans vos données...")
    exit(1)

  print("Accélérateur de particules en cours...")

  if resultat:
    print("Bien joué ! Voici le résultat de l'analyse des données :")
    print(os.getenv("FLAG", "404CTF{Fake_Flag}"))
  else:
    print("Malhereusement vos particules ont échoué à se rencontrer...")

Le programme simule un "accélérateur de particules" qui demande deux entrées hexadécimales. Le but est que en sortie que 2 hashs soit identique afin d'obtenir le flag ce qui peut être une collision de hashs en cryptographie :

  1. hash(bytes.fromhex(particule_a)) == hash(bytes.fromhex(particule_b)) (pour déclencher la collision).
  2. Mais on ne doit pas donné les même valeurs pour particule_a et particule_b car une condition stop le script si c'est le cas, (sinon ça serai trop facile).

Tentative de collision sha256

j'ai écris Un programme qui va tester une collision de hashs ça ne marchera pas évidement car il existe 105312291668557186697918027683670432318895095400549111254310977536 de combinaisons possible avec le sha256 et à ce jour on n'a pas encore trouvé de collision source : https://steemit.com/fr/@peneinc/une-collision-sha256-est-elle-possible-hash-math-blog

tentative collision de hashs sha256 en cryptograpie


Le piège

On ne doit pas chercher des collisions sha256 comme le code python laisserez à penser car aucune collision sha256.


La faille

Le code Python est conçue pour traiter des caractères hexadécimaux. Elle est insensible à la casse pour les lettres (A-F sont traitées de la même manière que a-f).

Donc la fonction bytes.fromhex() à un défaut car certain caractères une fois transformer peuvent être considérer comme égale. Par exemple aa donne b'\xaa' et AA donne b'\xaa' ce qui est identique donc génère le même hash.

Donc En utilisant aa et AA :

  • La condition if "aa" == "AA" est fausse, donc le programme continue.
  • La conversion bytes.fromhex("aa") produit l'octet b'\xaa'.
  • La conversion bytes.fromhex("AA") produit l'octet b'\xaa'.
  • Le résultat du hash SHA-256 pour ces deux entrées est donc identique, ce qui valide la condition de victoire.

Solution

Pour obtenir le flag, il suffit d'exécuter le script et de fournir les valeurs suivantes lors de l'invite :

  1. On doit d'abord aller dans le terminal pour ce connecter au défis taper : nc challenge.404ctf.fr 10007
  2. Position de la première particule : aa
  3. Position de la deuxième particule : AA

challenge ctf python cryptographie