Solution de ThierryBesancon pour Sur la trace

intro reverse linux x86/x64

5 juillet 2026

Etape 1 : reconnaissance du terrain.

Il s’agit d’un challenge Python.

La lecture du fichier « main.py » montre que l’on a affaire à un fichier résultat de PYARMOR. C’est un logiciel d’obfuscation de code Python.

J’ai fait un peu de recherche bibliographique sur PYARMOR et son reversing. On trouve de la littérature sur le sujet. En gros, il y a quelques outils qui marchottent plus ou moins selon la version de PYARMOR utilisée. Un article mentionne une utilisation de FRIDA ce que j’ai essayé aussi accompagné d’un autre outil qui malheureusement ne donne rien au final.

A ce niveau là, en gros, je suis globalement toujours sur la case départ.

Mais je n’ai pas utilisé deux choses :

  • Le challenge est censé être facile.
  • Le nom du programme est en général un indice. « Sur la trace ».

Etape 2 : approche classique gagnante.

Que fait le programme ?

$ python3 main.py
Le fichier n'existe pas, je n'écris pas le flag

OK. Le programme semble attendre la présence d’un fichier mais ne le trouve pas. Soit le programme liste le contenu d’un répertoire (vraisemblablement le dossier courant) et n’y trouve pas le fichier qu’il veut, soit il va tester directement l’existence du fichier voulu. Si c’est le second cas, le code Python se traduira par un syscall de type stat().

Pour tester tout cela, l’outil classique est strace. Strace versus « sur la trace » nom du challenge. Cela va dans le bon sens.

$ strace -o strace.log python3 main.py
Le fichier n'existe pas, je n'écris pas le flag

$ grep stat strace.log
...
fstat(3, {st_mode=S_IFREG|0644, st_size=14408, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=14408, ...}) = 0
newfstatat(AT_FDCWD, "flag_d0bb5ce8945de690f933b9c1012d0b42", 0x7ffedfe600c0, 0) = -1 ENOENT (No such file or directory)

Le programme PYTHON obfusqué fait donc un stat() du fichier flag_d0bb5ce8945de690f933b9c1012d0b42 qu’il ne trouve pas et décide en conséquence de se saborder.

Créons le fichier.

$ touch flag_d0bb5ce8945de690f933b9c1012d0b42
$ python3 main.py
Tu peux récupérer ton flag

$ cat flag_d0bb5ce8945de690f933b9c1012d0b42
FCSC{DYn4m1c_An4lYs1S_FTW}

Le flag se valide.

QED.

🐒