hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md

6.2 KiB

AW2Exec - GOT/PLT

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Informações Básicas

GOT: Tabela de Deslocamento Global

A Tabela de Deslocamento Global (GOT) é um mecanismo usado em binários vinculados dinamicamente 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 ao vínculo dinâmico), 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 à mesma função usam o endereço armazenado na GOT, evitando assim a sobrecarga de resolver o endereço novamente.

PLT: Tabela de Ligação de Procedimentos

A Tabela de Ligação de Procedimentos (PLT) trabalha em estreita colaboração 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 vinculador dinâmico para resolver o endereço da função, caso ainda não tenha 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 o vinculador dinâmico.

Obter Execução

Verifique 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 0xADDR_GOT

Usando o GEF você pode iniciar uma sessão de debugging e executar got para ver a tabela got:

GOT2Exec

Em um binário, a GOT tem os endereços para as funções ou para a seção PLT que irá 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 mais tarde com o endereço da PLT da função system por exemplo.

Idealmente, você irá substituir a GOT de uma função que está prestes a ser 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 esse endereço.

Você pode ver os endereços da PLT com objdump -j .plt -d ./vuln_binary

One Gadget

{% content-ref url="../one-gadget.md" %} one-gadget.md {% endcontent-ref %}

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 após isso:

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

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}