WWW2Exec - __malloc_hook & __free_hook
Reading time: 5 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Malloc Hook
Όπως μπορείτε να δείτε στον Επίσημο ιστότοπο GNU, η μεταβλητή __malloc_hook
είναι ένας δείκτης που δείχνει στη διεύθυνση μιας συνάρτησης που θα καλείται όποτε καλείται το malloc()
αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα One Gadget για παράδειγμα και κληθεί το malloc
, το One Gadget θα κληθεί.
Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με **καλώντας printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το
libc` να καλέσει το malloc για να τα δεσμεύσει στο heap.
Περισσότερες πληροφορίες σχετικά με το One Gadget στο:
warning
Σημειώστε ότι οι hooks είναι απενεργοποιημένες για GLIBC >= 2.34. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Free Hook
Αυτό εκμεταλλεύτηκε σε ένα από τα παραδείγματα της σελίδας εκμεταλλευόμενος μια επίθεση γρήγορης bin μετά από την εκμετάλλευση μιας επίθεσης unsorted bin:
Είναι δυνατόν να βρείτε τη διεύθυνση του __free_hook
αν το δυαδικό αρχείο έχει σύμβολα με την ακόλουθη εντολή:
gef➤ p &__free_hook
Στην ανάρτηση μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του 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 <list_all_lock+15>: 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://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.