<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
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**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
```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']
)
```
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 de `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).
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**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Este foi o exploit final desse exemplo:
* 64 bits, ASLR ativado mas sem PIE, o primeiro passo é preencher um estouro de buffer até o byte 0x00 do canário e então chamar puts para vazá-lo. Com o canário, um ROP gadget é criado para chamar puts e vazar o endereço de puts do GOT e um ROP gadget para chamar `system('/bin/sh')`.
* 64 bits, ASLR ativado, sem canário, estouro de pilha em main a partir de uma função filha. ROP gadget para chamar puts e vazar o endereço de puts do GOT e então chamar um one gadget.