# 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2Fi5pFKb1AJ616P7r7TwdU%2Fsource_code.png?alt=media&#x26;token=1611e249-1550-468f-9910-ad527c1c604c" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FOLBo2FhhVam1nS6EyxT4%2Fbreakpoint.png?alt=media&#x26;token=52edf0a7-a2ce-408a-b1ec-556ba5269404" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FV2O4fCJ5dbVKAb9S6pK4%2Flocations.png?alt=media&#x26;token=e08cb7e2-b7b3-4ae0-ae6c-7ced852d9722" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FMOissWYcU8EPfiuoebqU%2Focorrencias.png?alt=media&#x26;token=f94ae492-a899-45c9-a742-ba59554a2567" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FFx8iRp9dPGJOqGnHDZ15%2Fcalculo.png?alt=media&#x26;token=29401415-a3a1-4dc8-97a7-2216105ba77c" alt=""><figcaption><p>Cálculo</p></figcaption></figure>

<figure><img src="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2F0ydMeTwQCZdHdbhkZ0ko%2Fconversao.png?alt=media&#x26;token=b3fc00b9-5832-4ff2-9ec2-36b823ac8823" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2Fm04S7BrU78zSmSeOTYbh%2Fprovando_na_stack.png?alt=media&#x26;token=11606977-b65e-4b68-912e-f2aefc3c3b47" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2F7bWeOl86wnR0CvKyYkEQ%2Ffind_address-1.png?alt=media&#x26;token=a52150c8-0d23-4e31-86bb-fcbb296d6388" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2F38gxgPBv0ktwFJEoFMSr%2Ffinal.png?alt=media&#x26;token=81c162e5-90e8-4f49-ac02-15806918706f" 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="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FnRdB2nXEKGDKRiaqvPF7%2Fexploit_linha_de_comando.png?alt=media&#x26;token=d5503cb2-c78b-4b04-a391-b7378723d2ca" alt=""><figcaption><p>Exploit via linha de comando</p></figcaption></figure>

## Exploit

<figure><img src="https://418865174-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFu6uaU65JuQBpnFAUDk8%2Fuploads%2FRd6KDcYV3j2tkSOn7tt0%2Fexploit_python.png.webp?alt=media&#x26;token=5ea56f3f-2edd-4eae-a297-fe7e3f1108c5" alt=""><figcaption><p>Exploit escrito em python</p></figcaption></figure>

\ <br>
