# WWW2Exec - \_\_malloc_hook & \_\_free_hook {{#include ../../banners/hacktricks-training.md}} ## **Malloc Hook** Όπως μπορείτε να δείτε στον [Επίσημο ιστότοπο GNU](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html), η μεταβλητή **`__malloc_hook`** είναι ένας δείκτης που δείχνει στη **διεύθυνση μιας συνάρτησης που θα καλείται** όποτε καλείται το `malloc()` **αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc**. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα **One Gadget** για παράδειγμα και κληθεί το `malloc`, το **One Gadget θα κληθεί**. Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με **καλώντας `printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το `libc` να καλέσει το malloc για να τα δεσμεύσει στο heap. Περισσότερες πληροφορίες σχετικά με το One Gadget στο: {{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}} > [!WARNING] > Σημειώστε ότι οι hooks είναι **απενεργοποιημένες για GLIBC >= 2.34**. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε: [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 Αυτό εκμεταλλεύτηκε σε ένα από τα παραδείγματα της σελίδας εκμεταλλευόμενος μια επίθεση γρήγορης bin μετά από την εκμετάλλευση μιας επίθεσης unsorted bin: {{#ref}} ../libc-heap/unsorted-bin-attack.md {{#endref}} Είναι δυνατόν να βρείτε τη διεύθυνση του `__free_hook` αν το δυαδικό αρχείο έχει σύμβολα με την ακόλουθη εντολή: ```bash gef➤ p &__free_hook ``` [Στην ανάρτηση](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του free hook χωρίς σύμβολα. Ως σύνοψη, στη συνάρτηση free:
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]--- BREAK HERE
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 
Στο αναφερόμενο σημείο διακοπής στον προηγούμενο κώδικα, στο `$eax` θα βρίσκεται η διεύθυνση του free hook. Τώρα εκτελείται μια **fast bin attack**: - Πρώτα απ' όλα, ανακαλύπτεται ότι είναι δυνατό να εργαστούμε με γρήγορες **chunks μεγέθους 200** στην τοποθεσία **`__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 :      0x0000000000000000      0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
- Εάν καταφέρουμε να αποκτήσουμε μια γρήγορη chunk μεγέθους 0x200 σε αυτή την τοποθεσία, θα είναι δυνατό να αντικαταστήσουμε έναν δείκτη συνάρτησης που θα εκτελείται - Για αυτό, δημιουργείται μια νέα chunk μεγέθους `0xfc` και καλείται η συγχωνευμένη συνάρτηση με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε μια ελεύθερη chunk μεγέθους `0xfc*2 = 0x1f8` στο fast bin. - Στη συνέχεια, καλείται η συνάρτηση edit σε αυτή την chunk για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**. - Στη συνέχεια, δημιουργείται μια chunk με μέγεθος `0x1f8` για να ανακτηθεί από το fast bin η προηγούμενη άχρηστη chunk, ώστε να δημιουργηθεί άλλη μια chunk μεγέθους `0x1f8` για να αποκτήσουμε μια γρήγορη chunk στο **`__free_hook`** που αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**. - Και τελικά, μια chunk που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη system με `/bin/sh\x00` ως παράμετρο. ## Αναφορές - [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}}