On doit tout d'abord télécharger le code exemple du défis afin de l'analyser
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 :
hash(bytes.fromhex(particule_a)) == hash(bytes.fromhex(particule_b)) (pour déclencher la collision).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
On ne doit pas chercher des collisions sha256 comme le code python laisserez à penser car aucune collision sha256.
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 :
if "aa" == "AA" est fausse, donc le programme continue.bytes.fromhex("aa") produit l'octet b'\xaa'.bytes.fromhex("AA") produit l'octet b'\xaa'.Pour obtenir le flag, il suffit d'exécuter le script et de fournir les valeurs suivantes lors de l'invite :
aaAA