Enoncé
Pour lancer le challenge, utilisez python dans le même répertoire que le script:
python3 main.py
Résolution
Quand on exécute le fichier on obtient le résultat suivant
Le fichier n'existe pas, je n'écris pas le flag
On est sur linux donc pour vérifier qu’un fichier existe, le processus n’a pas 36000 solutions, il doit faire un appel système (aussi appelé syscall).
Il existe un programme pour tous les intercepter sur linux : strace
Quand on l’exécute la sortie est assez bloated puisqu’il y a plein de choses qui sont juste le “démarrage” de python…
J’ai donc écrit un hello_world.py pour comparer (juste print("hello world"))
On peut comparer la sortie entre les deux programmes pour ensuite voir où l’exécution du programme obfusqué commence.
diff <(strace python3 main.py 2>&1) <(strace python3 hello_world.py 2>&1)
Mis à part les timestamp tout est pareil jusqu’à
521c521
< read(3, "# Pyarmor 9.2.4 (trial), 000000,"..., 4096) = 3325
---
> read(3, "print(\"hello world\")\n", 4096) = 21
524,609c524,543
< newfstatat(AT_FDCWD, "/home/FCSC/sur_la_trace", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
< newfstatat(AT_FDCWD, "/home/FCSC/sur_la_trace", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
< newfstatat(AT_FDCWD, "/hom
A partir d’ici on cherche tous les appels systèmes qui correspondent à de la lecture de fichiers / leur existence (fstat, read, openat, getdents), et on voit la ligne:
< newfstatat(AT_FDCWD, "flag_d0bb5ce8945de690f933b9c1012d0b42", 0x7fff80177cc0, 0) = -1 ENOENT(No such file or directory)
On crée le fichier dans le dossier courant et on obtient le flag.
PS
Quand on lit l’ensemble des appels systèmes on a quand même une assez bonne idée de ce qu’il se passe concrètement, ici il crée des zones mémoire, ajoute des choses dedans, change leurs perms… donc si on veut on doit pouvoir récupérer le binaire executé sans trop de difficultés…