Solution de OliverSwift pour Randomito

misc

30 janvier 2025

Si on examine le code python on peut espérer une faille sur la fonction ‘randint()’ avec peut être une influence de seed. Mais on remarque la première ligne du code qui contient le shebang suivant :

#!/usr/local/bin/python2.7

Le script fait appel à python2.7. Là aussi on espère une faille autour de randint dans cette version.

Mais c’est plus subtil, le script utilise input() pour saisir les propositions de l’Oracle que nous sommes :

 24                 p("[+] Done! Now, try go guess it!\n")
 25                 p(">>> a = ")
 26                 a = int(input())
 27                 p(">>> b = ")
 28                 b = int(input())

Or dans cette version il est clairement stipulé dans la documentation de Python2.7 :

input([prompt])

    Equivalent to eval(raw_input(prompt)).

    This function does not catch user errors. If the input is not syntactically valid, a SyntaxError will be raised. Other exceptions may be raised if there is an error during evaluation.

    If the readline module was loaded, then input() will use it to provide elaborate line editing and history features.

    Consider using the raw_input() function for general input from users.

Ce qui n’est plus vrai dans les versions à partir de 3.0.

Donc, il y a bien une évaluation en Python de la saisie. On ne peut pas faire pire d’un point de vue cyber.

Or les deux secrets sont stockés dans les variables secret_a et secret_b :

 21                 secret_a = randint(0, 2**64 - 1)
 22                 secret_b = randint(0, 2**64 - 1)
 23                 secret   = "{:016x}{:016x}".format(secret_a, secret_b)

Il nous suffit de saisir les deux noms de variables au moment du prompt :

$ nc localhost 4000
[+] Generating a 128-bit random secret (a, b)
[+] Done! Now, try go guess it!
>>> a = secret_a
>>> b = secret_b
[-] Trying 0a30ca4c4aadd824a0ecc9e213485d65
[+] Well done! Here is the flag: FCSC{4496d11d19db92ae53e0b9e9415d99d877ebeaeab99e9e875ac346c73e8aca77}

Tada.