Dépassement de tampon (Intro) - FCSC 2022

Dépassement de tampon (Intro) - FCSC 2022

Fichiers du challenge Principe:
Un simple buffer overflow nécessitant de rediriger l'addresse vers un emplacement spécifique du programme, pour obtenir un shell. Envoyer correctement le payload fut le plus compliqué

Dépassement de tampon — FCSC2022

Prise en main

Le but est d'exploiter un "buffer overflow" sur le programme fourni (disponible ici, ainsi que mes codes de résolution)
On lance le programme, on entre une chaine trop longue, et il crash

Le Débuggeur

Via un débugger, comme edb, on recommence le même test
On lance l'exécution pas à pas (F8), et on stoppe au moment d'entrer les données
Dans ce même programme, on trouve une addresse qui nous donnerait un shell (bash): le but est donc de prendre le contrôle du flow d'exécution, pour le rediriger sur cette addresse et obtenir un shell (en local d'abord, puis on refera les mêmes étapes sur le challenge en ligne)

Tester à la main

On entre donc une chaîne non-répétitive et trop longue issue de msfvenom_pattern-create
La chaîne se retrouve sur la stack
On avance pas à pas, jusqu'à arriver au RTN (return assembleur)
On modifie la valeur de la stack à la main pour mettre l'addresse désirée 4011a2

Il faut prendre garde à l'endian de la stack: la valeur à entrer à la main sera en fait a2 11 40 00 00 00 00 00

Quand on avance d'un pas (F8), l'EIP (RIP ici, car 64 bits) a pris la valeur entrée à la main, et le flow d'exécution a été redirigé à l'endroit voulu
On continue l'exécution (F9) et on a bien un shell: notre idée fonctionne. Reste à la mettre en pratique sans devoir utiliser le débugger

Le payload réel

On reprend la chaine string précédente, et on insère l'addresse désirée à l'endroit correspondant, avec le bon endian, et on l'envoie au programme
Mais… ça n'a pas marché

J'ai perdu des plombes là dessus, à ne pas comprendre pourquoi ce payload ne marche pas…

mkfifo

En passant par mkfifo (named pipe), le problème ne se pose plus, et le shell se lance… mais celui-ci se ferme immédiatement!

Le désespoir avec PHP

La stratégie du désespoir: un script PHP qui cherchera en boucle le process pwn pour lui envoyer le payload!
On lance le script PHP, on lance ensuite cat|pwn (pour que stdin reste ouvert et accessible) et ça marche!

Le flag

On refait la même avec le vrai challenge, et on obtient le flag FCSC{5f25ae8fd59160b018e8ef21ff8972cdb2e3ab98e4f7bfced4e60255d378aee8}

On peut se contenter d'un cat|./pwn et d'utiliser ps -aux|grep 'pwn' dans un autre terminal pour trouver le PID du process pwn. On lui envoie alors les données vers stdin via la commande cat binshell.dat > /proc/PID/fd/0
Le PHP script fait cela automatiquement

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil