Principe:
Exploiter un binaire classique en prenant la main sur l'EIP pour rediriger l'exécution vers la stack (NX disabled) et obtenir un shell pour lire le flag
Le challenge
Ce challenge s'appelle "Fragile" dans mes dossiers et "Sans protection" dans le CTF: j'ignore pourquoi. Peut-être avait-il changé de nom en cours de route?
Exploration
C'est un bon réflexe à avoir quand on veut exploiter un binaire car ces quelques protections peuvent rapidement rendre compliquées un exploit (voire impossible) lorsqu'elles sont actives
Overflow
On note que le binaire nous donne ce qui ressemble à une addresse: je ne serai pas étonné que ce soit un leak à exploiter
Si on peut écraser l'EIP (ou RIP qui est son nom lorsqu'on est en 64 bits) alors on pourra rediriger l'exécution du programme vers une addresse mémoire de notre choix
Comme NX (No Execute) n'est pas actif, toute la mémoire du programme sera exécutable. Si on a une addresse dans la mémoire ou la stack vers un emplacement dont on contrôle le contenu (par exemple, l'addresse de ce qu'on a entré) alors on aura une RCE (Remote Code Execution)
Stack dynamique
Exploitation
La commande ls aussi avait fail, d'où l'idée de directement faire un cat
Je m'étais dit "peut-etre que cat n'est pas sur le serveur? et qu'il faut utiliser un autre moyen de lire le flag, genre xxd?"
On notera que cat avait stoppé à la première commande, alors que base64 affiche bien superman et lexluthor. Le 4 qui apparait avec cat me laisse à penser que seul le 1er caractère du fichier flag est lu, j'ignore pourquoi
Wireshark (sorti de nulle part)
Cela m'a permis de me dire "le pipe réseau doit être coupé trop tôt par mon script… pourquoi?"
Je faisais un while (fgetc…), qui va renvoyer string "0" pour le second caractère du flag (404CTF{…}). Comme PHP fait des conversions de typage, le string "0" devient false, et donc, le while se stoppe!