WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Όπως μπορείτε να δείτε στον Επίσημο ιστότοπο GNU, η μεταβλητή __malloc_hook
είναι ένας δείκτης που δείχνει στη διεύθυνση μιας συνάρτησης που θα καλείται όποτε καλείται το malloc()
αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα One Gadget για παράδειγμα και κληθεί το malloc
, το One Gadget θα κληθεί.
Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με καλώντας printf("%10000$c")
που δεσμεύει πάρα πολλά bytes κάνοντάς το libc
να καλέσει το malloc για να τα δεσμεύσει στο heap.
Περισσότερες πληροφορίες σχετικά με το One Gadget μπορείτε να βρείτε στο:
One GadgetΣημειώστε ότι οι hooks είναι απενεργοποιημένες για GLIBC >= 2.34. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Αυτό εκμεταλλεύτηκε σε ένα από τα παραδείγματα της σελίδας εκμεταλλευόμενος μια γρήγορη επίθεση bin μετά την εκμετάλλευση μιας επίθεσης unsorted bin:
Unsorted Bin AttackΕίναι δυνατόν να βρείτε τη διεύθυνση του __free_hook
αν το δυαδικό αρχείο έχει σύμβολα με την ακόλουθη εντολή:
Στην ανάρτηση μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του free hook χωρίς σύμβολα. Ως περίληψη, στη συνάρτηση free:
Στο αναφερόμενο σημείο διακοπής στον προηγούμενο κώδικα στο $eax
θα βρίσκεται η διεύθυνση του free hook.
Τώρα εκτελείται μια επίθεση fast bin:
Πρώτα απ' όλα ανακαλύπτεται ότι είναι δυνατό να εργαστούμε με γρήγορες κομμάτια μεγέθους 200 στην τοποθεσία __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
για να αποκτήσουμε ένα γρήγορο κομμάτι στο __free_hook
το οποίο αντικαθίσταται με τη διεύθυνση της συνάρτησης system
.
Και τελικά, ένα κομμάτι που περιέχει τη συμβολοσειρά /bin/sh\x00
απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση __free_hook
που δείχνει στη system με /bin/sh\x00
ως παράμετρο.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)