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