> For the complete documentation index, see [llms.txt](https://vida03.gitbook.io/redteam/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vida03.gitbook.io/redteam/binary-exploitation/hook-na-got.md).

# Hook na GOT

## Introdução

Estarei explicando na prática como funciona o hook na GOT, como a challenge que estarei usando de exemplo é sobre heap exploitation então será necessário um conhecimento básico sobre alocação dinâmica e conhecimento básico sobre a tabela GOT

Sem mais delongas vamos primeiro analizar o source code:

<figure><img src="/files/BunoaJBROanReTudImrg" alt=""><figcaption><p>Source Code</p></figcaption></figure>

Vou dar uma breve explicação sobre o código, ele está fazendo uma struct que vai guardar um inteiro e um char, na main ele define essa struct para \*i1 e \*i2, para a i1 ele aloca na heap o tamanho da **heapStructure**, depois define o ponteiro para priority como 1, logo em seguida aloca mais 8 bytes na heap para o ponteiro name, o mesmo ocorre com i2. O strcpy não está verificando o tamanho, por conta disso o código fica vulnerável a exploração

Perceba que no final da execução da main é chamado um printf() sem formatação o compilador automatiza o printf() para puts(), perceba também que winner() não foi chamada em nenhum lugar do código, então a ideia aqui é redirecionar o fluxo para winner(), faremos isso da seguinte forma:\
\=> Vamos estourar o primeiro strcpy até chegar no ponteiro para o i2->name\
\=> Vamos sobrescrever o ponteiro com a GOT da puts com o endereço da winner, porque quando o último puts() for executado ele chamará a winner()

Vamos ver como fazemos isso, primeiramente vou ver em que lugar da heap está nosso input:

<figure><img src="/files/UHQhwwFK8A7O5OxEh6QP" alt=""><figcaption><p>Breakpoint depois da função puts()</p></figcaption></figure>

É necessário definir esse breakpoint para que o programa não encerre sua execução, agora vou executar: **`r AAAA BBBB`**

<figure><img src="/files/ohF3GwuAXOT9KmEMxatm" alt=""><figcaption><p>Localização dos nossos inputs</p></figcaption></figure>

Se você estiver usando o **gdb-peda** use **`find AAAA`**\
Enfim, nosso primeiro input está em: **0xf7e69018**\
Vou pegar umas 30 ocorrências apartir desse endereço:

<figure><img src="/files/B9U5LoIWATH9TahqZlE7" alt=""><figcaption><p>Ocorrências</p></figcaption></figure>

Agora chega a parte legal, perceba que em **0xf7e902c**(0xf7e9028 + 0x4) temos **0xf7e6938**, que é um ponteiro para o nosso segundo input, perceba que ele aponta para **0xf7e69038** que tem justamente o nosso **BBBB**(segundo input)

Agora vamos ver com quantos byes chegamos até esse ponteiro a conta é bem fácil só subtrair:\
**0xf7e902c** **– 0xf7e69018** **= 0x14** **(20 bytes)**\
lembrando que **0xf7e69018** é o endereço do nosso primeiro input

<figure><img src="/files/K35ZEcEBzFP7SkJULkK8" alt=""><figcaption><p>Cálculo</p></figcaption></figure>

<figure><img src="/files/9tCCqLz5Kk75XWu3edCE" alt=""><figcaption><p>Conversão</p></figcaption></figure>

Então com 20 bytes chegamos até o ponteiro qualquer coisa que escrevemos depois dos 20 bytes está sobrescrevendo o ponteiro

<figure><img src="/files/7dFArCGkphUBJAUGPFMr" alt=""><figcaption><p>Proof of Concept</p></figcaption></figure>

Comando executado: **`r $(python -c “print ‘A’*20”) $(python -c “print ‘B’*4”)`**\
Você pode notar que 0x41 são nossos A’s, e o ponteiro **0xf7e69000** aponta para os nossos B’s que são 0x42

A hook da GOT começa aqui, vamos substituir o ponteiro para puts\@got, pois assim ele vai apontar para puts\@got e lá sobrescrevemos para o endereço da winner(), assim quando o último printf() for executado ele irá chamar a winner(), vamos ver isso na prática

<figure><img src="/files/H7JIF7XcvQyNyI0bKCXt" alt=""><figcaption><p>Encontrando os endereços</p></figcaption></figure>

Primeiro vamos localizar o endereço da puts\@got e da winner():

Vamos rodar isso:\
\&#xNAN;**`r $(python -c “print ‘A’*20 + ‘\x08\x04\xc1\x40′[::-1]”) $(python -c “print ‘\x08\x04\x88\x91′[::-1]”)`**\
obs: \[::-1] é para inverter o endereço já que estamos lidando com little endian\
recapitulando: mandamos os A’s até chegar no ponteiro, sobrescrevemos ele com a puts\@got, lá vamos sobrescrever com o endereço da winner(), ele vai resolver o endereço da winner() e da próxima vez que chamar a printf() vai chamar a nossa winner(), pois ela que foi resolvida

<figure><img src="/files/oEuUCCYKO7iDe8nFbTKn" alt=""><figcaption><p>Análise final</p></figcaption></figure>

Então como foi dito veja que o ponteiro aponta para a puts\@got elá está justamente o endereço da winner, agora quando o puts foi executado novamente ele vai chamar a winner

<figure><img src="/files/PBOr8I0LSWemUf4zCFkz" alt=""><figcaption><p>Exploit via linha de comando</p></figcaption></figure>

## Exploit

<figure><img src="/files/YIOQqWdegZKdTYNCJfn6" alt=""><figcaption><p>Exploit escrito em python</p></figcaption></figure>

\ <br>
