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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://vida03.gitbook.io/redteam/binary-exploitation/hook-na-got.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
