hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

113 lines
8.3 KiB
Markdown
Raw Normal View History

# WWW2Exec - GOT/PLT
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras maneiras de apoiar o HackTricks:
* 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** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## **Informações Básicas**
### **GOT: Tabela de Deslocamento Global**
A **Tabela de Deslocamento Global (GOT)** é um mecanismo usado em binários com ligação dinâmica para gerenciar os **endereços de funções externas**. Como esses **endereços não são conhecidos até o tempo de execução** (devido à ligação dinâmica), a GOT fornece uma maneira de **atualizar dinamicamente os endereços desses símbolos externos** uma vez que são resolvidos.
Cada entrada na GOT corresponde a um símbolo nas bibliotecas externas que o binário pode chamar. Quando uma **função é chamada pela primeira vez, seu endereço real é resolvido pelo linkador dinâmico e armazenado na GOT**. Chamadas subsequentes para a mesma função usam o endereço armazenado na GOT, evitando assim o custo de resolver o endereço novamente.
### **PLT: Tabela de Ligação de Procedimentos**
A **Tabela de Ligação de Procedimentos (PLT)** trabalha em conjunto com a GOT e serve como um trampolim para lidar com chamadas a funções externas. Quando um binário **chama uma função externa pela primeira vez, o controle é passado para uma entrada na PLT associada a essa função**. Esta entrada da PLT é responsável por invocar o linkador dinâmico para resolver o endereço da função se ainda não tiver sido resolvido. Após o endereço ser resolvido, ele é armazenado na **GOT**.
**Portanto,** as entradas da GOT são usadas diretamente uma vez que o endereço de uma função ou variável externa é resolvido. **As entradas da PLT são usadas para facilitar a resolução inicial** desses endereços via linkador dinâmico.
## Obter Execução
### Verificar a GOT
Obtenha o endereço da tabela GOT com: **`objdump -s -j .got ./exec`**
![](<../../.gitbook/assets/image (121).png>)
Observe como após **carregar** o **executável** no GEF você pode **ver** as **funções** que estão na **GOT**: `gef➤ x/20x 0xADDR_GOT`
![](<../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
Usando o GEF você pode **iniciar** uma sessão de **depuração** e executar **`got`** para ver a tabela got:
![](<../../.gitbook/assets/image (496).png>)
### GOT2Exec
Em um binário a GOT tem os **endereços das funções ou** da seção **PLT** que carregará o endereço da função. O objetivo desta escrita arbitrária é **substituir uma entrada da GOT** de uma função que será executada posteriormente **com** o **endereço** do PLT da função **`system`** por exemplo.
Idealmente, você irá **substituir** a **GOT** de uma **função** que está **sendo chamada com parâmetros controlados por você** (assim você poderá controlar os parâmetros enviados para a função system).
Se **`system`** **não for usada** pelo binário, a função system **não** terá uma entrada na PLT. Neste cenário, você precisará **vazar primeiro o endereço** da função `system` e então sobrescrever a GOT para apontar para este endereço.
Você pode ver os endereços da PLT com **`objdump -j .plt -d ./vuln_binary`**
## Entradas GOT da libc
A **GOT da libc** geralmente é compilada com **RELRO parcial**, tornando-a um bom alvo para isso, supondo que seja possível descobrir seu endereço ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
Funções comuns da libc vão chamar **outras funções internas** cuja GOT poderia ser sobrescrita para obter execução de código.
Encontre [**mais informações sobre essa técnica aqui**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
## **Free2system**
Em CTFs de exploração de heap, é comum poder controlar o conteúdo de chunks e em algum momento até mesmo sobrescrever a tabela GOT. Um truque simples para obter RCE se um gadget não estiver disponível é sobrescrever o endereço GOT de `free` para apontar para `system` e escrever dentro de um chunk `"/bin/sh"`. Dessa forma, quando este chunk for liberado, ele executará `system("/bin/sh")`.
## **Strlen2system**
Outra técnica comum é sobrescrever o endereço **`strlen`** GOT para apontar para **`system`**, então se esta função for chamada com entrada do usuário é possível passar a string `"/bin/sh"` e obter um shell.
Além disso, se `puts` for usado com entrada do usuário, é possível sobrescrever o endereço GOT de `puts` para apontar para `system` e passar a string `"/bin/sh"` para obter um shell porque **`puts` chamará `strlen` com a entrada do usuário**.
## **One Gadget**
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
{% endcontent-ref %}
## **Abusando da GOT do Heap**
Uma maneira comum de obter RCE a partir de uma vulnerabilidade de heap é abusar de um fastbin para ser possível adicionar parte da tabela GOT no fast bin, então sempre que aquele chunk for alocado será possível **sobrescrever o ponteiro de uma função, geralmente `free`**.\
Em seguida, apontar `free` para `system` e liberar um chunk onde foi escrito `/bin/sh\x00` executará um shell.
É possível encontrar um [**exemplo aqui**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)**.**
## **Proteções**
A proteção **Full RELRO** é destinada a proteger contra esse tipo de técnica, resolvendo todos os endereços das funções quando o binário é iniciado e tornando a **tabela GOT somente leitura** depois disso:
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
[relro.md](../common-binary-protections-and-bypasses/relro.md)
{% endcontent-ref %}
## Referências
* [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](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 repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>