7.8 KiB
WWW2Exec - GOT/PLT
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 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 HackTricks e HackTricks Cloud github repos.
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 vinculador 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 Vínculo de Procedimento
A Tabela de Vínculo de Procedimento (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. Essa entrada da PLT é responsável por invocar o vinculador dinâmico para resolver o endereço da função se ainda não tiver sido resolvido. Após a resolução do endereço, 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 o vinculador dinâmico.
Obter Execução
Verificar a GOT
Obtenha o endereço da tabela GOT com: objdump -s -j .got ./exec
Observe como após carregar o executável no GEF você pode ver as funções que estão na GOT: gef➤ x/20x 0xDIR_GOT
Usando o GEF você pode iniciar uma sessão de depuração e executar got
para ver a tabela got:
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 usado pelo script, a função system não terá uma entrada na PLT. Nesse 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).
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.
Free2system
Em CTFs de exploração de heap, é comum poder controlar o conteúdo dos blocos 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 do free
para apontar para system
e escrever dentro de um bloco "/bin/sh"
. Dessa forma, quando esse bloco for liberado, ele executará system("/bin/sh")
.
One Gadget
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} 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 ao fast bin, para que sempre que esse bloco for alocado seja possível sobrescrever o ponteiro de uma função, geralmente free
.
Então, apontando free
para system
e liberando um bloco onde foi escrito /bin/sh\x00
executará um shell.
É possível encontrar um exemplo aqui.
Proteções
A proteção Full RELRO visa 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 {% endcontent-ref %}
Referências
- 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
Aprenda hacking na 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 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 repositórios HackTricks e HackTricks Cloud.