Analyse
On déduit de la catégorie misc et du hint qu’on doit trouver l’astuce qui valide l’entrée s
int(base64decode(s)) = eval(s)
Plus précisément, dans le programme fourni :
-
l’entrée est évaluée via
eval
d’un coté, en s’assurant qu’il est impossible d’injecter des appels à des fonctions python à l’aide de l’assertion :assert not any(isinstance(node, ast.Call) for node in ast.walk(tree))
-
puis, l’entrée est décodé au format base64 via :
int.from_bytes(base64.b64decode(s), byteorder = 'little')
Les deux résultats doivent être identiques pour afficher le flag.
On remarque que l’appel à b64decode
ne comporte pas le paramètre validate=True
, donc tous les caractères
non présents dans l’alphabet base64 seront ignorés.
De plus, avec une chaine vide, int.from_bytes(base64.b64decode(""), byteorder = 'little')
renvoie 0.
Solution
Il ne reste plus qu’à trouver une expression python ne comportant aucun caractère de l’alphabet base64 qui sera évalué à 0 :
$ nc localhost 4000
>>> "&"=="$"
FCSC{15426100f6ad140a6279d58b365d74dd1d2701c9e87231f0e056d902dbd175ea}