WWW2Exec - __malloc_hook & __free_hook
Αγκίστρι Malloc
Όπως μπορείτε να δείτε στην επίσημη σελίδα του 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.
Αγκίστρι Free
Αυτό καταχράστηκε σε ένα από τα παραδείγματα από τη σελίδα κατάχρησης ενός γρήγορου 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
ως παράμετρο.
Αναφορές
Last updated