# WWW2Exec - \_\_malloc_hook & \_\_free_hook {{#include ../../banners/hacktricks-training.md}} ## **Malloc Hook** Resmi GNU sitesinde belirtildiği gibi, **`__malloc_hook`** değişkeni, `malloc()` çağrıldığında **çağrılacak bir fonksiyonun adresine işaret eden bir işaretçidir** ve bu adres **libc kütüphanesinin veri bölümünde saklanır**. Bu nedenle, bu adres bir **One Gadget** ile üzerine yazılırsa ve `malloc` çağrılırsa, **One Gadget çağrılacaktır**. Malloc'u çağırmak için programın bunu çağırmasını beklemek veya **`printf("%10000$c")`** çağrısı yaparak, `libc`'nin bunları yığın üzerinde tahsis etmesini sağlamak mümkündür. One Gadget hakkında daha fazla bilgi için: {{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}} > [!WARNING] > Hooks'un **GLIBC >= 2.34 için devre dışı olduğunu** unutmayın. Modern GLIBC sürümlerinde kullanılabilecek diğer teknikler vardır. Bakınız: [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). ## Free Hook Bu, sıralanmamış bir kutu saldırısından sonra hızlı bir kutu saldırısını kötüye kullanan sayfadaki örneklerden birinde kötüye kullanıldı: {{#ref}} ../libc-heap/unsorted-bin-attack.md {{#endref}} Binariesinin sembolleri varsa `__free_hook` adresini bulmak mümkündür: ```bash gef➤ p &__free_hook ``` [Postta](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) semboller olmadan serbest kancanın adresini nasıl bulacağınıza dair adım adım bir kılavuz bulabilirsiniz. Özetle, serbest fonksiyonda:
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]--- BURADA KIRIL
0xf75deddb : test eax,eax ;<
0xf75deddd : jne 0xf75dee50
Yukarıdaki kodda belirtilen kırılma noktasında `$eax` içinde serbest kancanın adresi bulunacaktır.
Şimdi bir **fast bin saldırısı** gerçekleştirilir:
- Öncelikle, **`__free_hook`** konumunda **200 boyutunda hızlı parçalar** ile çalışmanın mümkün olduğu keşfedilir:
- 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
- Eğer bu konumda 0x200 boyutunda bir hızlı parça elde edebilirsek, çalıştırılacak bir fonksiyon işaretçisini yazmak mümkün olacaktır.
- Bunun için, `0xfc` boyutunda yeni bir parça oluşturulur ve birleştirilmiş fonksiyon bu işaretçi ile iki kez çağrılır, bu şekilde hızlı parçadaki `0xfc*2 = 0x1f8` boyutunda serbest bir parçaya işaret eden bir işaretçi elde ederiz.
- Ardından, bu parçadaki düzenleme fonksiyonu çağrılır ve bu hızlı parçanın **`fd`** adresi önceki **`__free_hook`** fonksiyonuna işaret edecek şekilde değiştirilir.
- Sonra, hızlı parçadan önceki işe yaramaz parçayı almak için `0x1f8` boyutunda bir parça oluşturulur, böylece **`__free_hook`** içinde bir hızlı parça elde etmek için `0x1f8` boyutunda başka bir parça oluşturulur ve bu parça **`system`** fonksiyonunun adresi ile üzerine yazılır.
- Ve nihayet, `/bin/sh\x00` dizesini içeren bir parça silme fonksiyonu çağrılarak serbest bırakılır, bu da **`__free_hook`** fonksiyonunu tetikler ve `/bin/sh\x00` parametre olarak sistem fonksiyonuna işaret eder.
## Referanslar
- [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).
{{#include ../../banners/hacktricks-training.md}}