# Εκτέλεση Κώδικα με Αυθαίρετη Εγγραφή - \_\_malloc\_hook & \_\_free\_hook {% hint style="success" %} Μάθετε & εξασκηθείτε στο Hacking του AWS:[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Μάθετε & εξασκηθείτε στο Hacking του GCP: [**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Υποστηρίξτε το HackTricks * Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)! * **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
{% endhint %} ## **Αγκίστρι Malloc** Όπως μπορείτε να δείτε στην [επίσημη σελίδα του 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 για να τα δεσμεύσει στη στοίβα. Περισσότερες πληροφορίες για το One Gadget στο: {% 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" %} Σημειώστε ότι τα αγκίστρια είναι **απενεργοποιημένα για 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). {% endhint %} ## Αγκίστρι Free Αυτό καταχράστηκε σε ένα από τα παραδείγματα από τη σελίδα κατάχρησης ενός γρήγορου bin μετά από κατάχρηση ενός μη ταξινομημένου bin επίθεσης: {% content-ref url="../libc-heap/unsorted-bin-attack.md" %} [unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md) {% endcontent-ref %} Είναι δυνατόν να βρεθεί η διεύθυνση του `__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 <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]--- ΔΙΑΚΟΠΗ ΕΔΩ
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>
Στην προαναφερθείσα διακοπή στον προηγούμενο κώδικα, στο `$eax` θα βρίσκεται η διεύθυνση του free hook. Τώρα πραγματοποιείται μια **επίθεση fast bin**: * Καταρχάς ανακαλύπτεται ότι είναι δυνατό να εργαστείτε με γρήγορα **κομμάτια μεγέθους 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 <list_all_lock+15>:      0x0000000000000000      0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
* Αν καταφέρουμε να αποκτήσουμε ένα γρήγορο κομμάτι μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατό να αντικαταστήσουμε ένα δείκτη συνάρτησης που θα εκτελεστεί * Γι' αυτό, δημιουργείται ένα νέο κομμάτι μεγέθους `0xfc` και καλείται η συνάρτηση συγχώνευσης με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε ένα δείκτη προς ένα ελεύθερο κομμάτι μεγέθους `0xfc*2 = 0x1f8` στο fast bin. * Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτό το κομμάτι για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**. * Στη συνέχεια, δημιουργείται ένα κομμάτι μεγέθους `0x1f8` για να ανακτήσει από το fast bin το προηγούμενο άχρηστο κομμάτι, έτσι δημιουργείται ένα άλλο κομμάτι μεγέθους `0x1f8` για να αποκτήσει ένα κομμάτι fast bin στο **`__free_hook`** το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**. * Και τέλος ένα κομμάτι που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στο σύστημα με το `/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).