6.8 KiB
WWW2Exec - __malloc_hook & __free_hook
{% 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Malloc Hook
Como você pode ver no site oficial do GNU, 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 esse 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 que o programa o chame ou **chamando printf("%10000$c")** que aloca muitos bytes, fazendo com que
libc` chame malloc para alocá-los na heap.
Mais informações sobre One Gadget em:
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
{% hint style="warning" %} Note que hooks estã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. {% 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 {% endcontent-ref %}
É possível encontrar o endereço de __free_hook
se o binário tiver símbolos com o seguinte comando:
gef➤ p &__free_hook
No 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:
gef➤ x/20i free
0xf75dedc0 <free>: push ebx
0xf75dedc1 <free+1>: call 0xf768f625
0xf75dedc6 <free+6>: add ebx,0x14323a
0xf75dedcc <free+12>: sub esp,0x8
0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb <free+27>: test eax,eax ;<
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
No break mencionado no código anterior, no $eax
estará localizado o endereço do free hook.
Agora um fast bin attack é realizado:
- Primeiro de tudo, foi descoberto que é possível trabalhar com chunks de tamanho 200 na localização de
__free_hook
: -
gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
- Se conseguirmos obter um chunk rápido de tamanho 0x200 nesta localização, será possível sobrescrever um ponteiro de função que será executado.
- Para isso, um novo chunk de tamanho
0xfc
é criado e a função mesclada é chamada com esse ponteiro duas vezes, assim obtemos um ponteiro para um chunk liberado de tamanho0xfc*2 = 0x1f8
no fast bin. - Em seguida, a função de edição é chamada neste chunk para modificar o endereço de
fd
deste fast bin para apontar para a função__free_hook
anterior. - Depois, um chunk com tamanho
0x1f8
é criado para recuperar do fast bin o chunk inútil anterior, então outro chunk de tamanho0x1f8
é criado para obter um chunk do fast bin na__free_hook
que é sobrescrito com o endereço da funçãosystem
. - E finalmente, um chunk contendo a string
/bin/sh\x00
é liberado chamando a função de delete, acionando a função__free_hook
que aponta para system com/bin/sh\x00
como parâmetro.
Referências
- 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.
{% 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.