# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras maneiras de apoiar o HackTricks: * Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
## **Malloc Hook** Conforme você pode ver no [site oficial da GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), a variável **`__malloc_hook`** é um ponteiro que aponta para o **endereço de uma função que será chamada** sempre que `malloc()` for chamado **armazenado na seção de dados da biblioteca libc**. Portanto, se este endereço for sobrescrito com um **One Gadget**, por exemplo, e `malloc` for chamado, o **One Gadget será chamado**. Para chamar malloc é possível esperar o programa chamar ou **chamando `printf("%10000$c")`** que aloca muitos bytes fazendo com que `libc` chame malloc para alocá-los no heap. Mais informações sobre One Gadget em: {% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} [one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md) {% endcontent-ref %} {% hint style="warning" %} Observe que os hooks são **desativados para GLIBC >= 2.34**. Existem outras técnicas que podem ser usadas em versões modernas do GLIBC. Veja: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). {% endhint %} ## Free Hook Isso foi abusado em um dos exemplos da página abusando de um ataque de fast bin após ter abusado de um ataque de unsorted bin: {% content-ref url="../libc-heap/unsorted-bin-attack.md" %} [unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md) {% endcontent-ref %} Um truque interessante (de [**aqui**](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)) para encontrar a localização do free hook se o binário tiver símbolos é **fazer algo como**: ``` gef➤ set __free_hook = 0xfacade gef➤ search-pattern 0xfacade ``` No mesmo post, você pode encontrar um guia passo a passo sobre como localizar o endereço do **free hook** sem símbolos. Em resumo, na função **free**: ```armasm gef➤ x/20i free 0xf75dedc0 : push ebx 0xf75dedc1 : call 0xf768f625 0xf75dedc6 : add ebx,0x14323a 0xf75dedcc : sub esp,0x8 0xf75dedcf : mov eax,DWORD PTR [ebx-0x98] 0xf75dedd5 : mov ecx,DWORD PTR [esp+0x10] 0xf75dedd9 : mov eax,DWORD PTR [eax] 0xf75deddb : test eax,eax ;<--- BREAK HERE 0xf75deddd : jne 0xf75dee50 ``` Na quebra mencionada no código anterior em `$eax` estará localizado o endereço do **free hook**. Agora é realizado um **ataque de fast bin**: - Primeiramente, é descoberto que é possível trabalhar com **pedaços rápidos de tamanho 200** na localização do **`__free_hook`**: - ```c gef➤ p &__free_hook $1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f : 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000 ``` - Se conseguirmos obter um pedaço rápido de tamanho 0x200 nessa localização, será possível sobrescrever um ponteiro de função que será executado. - Para isso, é criado um novo pedaço de tamanho `0xfc` e a função mesclada é chamada com esse ponteiro duas vezes, dessa forma obtemos um ponteiro para um pedaço liberado de tamanho `0xfc*2 = 0x1f8` no fast bin. - Em seguida, a função de edição é chamada neste pedaço para modificar o endereço **`fd`** deste fast bin para apontar para a função anterior **`__free_hook`**. - Depois, é criado um pedaço com tamanho `0x1f8` para recuperar do fast bin o pedaço inútil anterior, então outro pedaço com tamanho `0x1f8` é criado para obter um pedaço do fast bin no **`__free_hook`** que é sobrescrito com o endereço da função **`system`**. - E finalmente, um pedaço contendo a string `/bin/sh\x00` é liberado chamando a função de exclusão, acionando a função **`__free_hook`** que aponta para o sistema com `/bin/sh\x00` como parâmetro. ## Referências - [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) - [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).