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

6.3 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:

Informações Básicas

GOT: Tabela de Deslocamento Global

A Tabela de Deslocamento Global (GOT) é um mecanismo usado em binários com linkagem 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 à linkagem 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. Essa 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 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 linkagem dinâmica.

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 usada 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

One Gadget

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

Proteções

A proteção Full RELRO destina-se 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 após isso:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: