WWW2Exec - __malloc_hook & __free_hook

Υποστηρίξτε το HackTricks

Αγκίστρι 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 αν το δυαδικό έχει σύμβολα με την ακόλουθη εντολή:

gef➤  p &__free_hook

Στην ανάρτηση μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του 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 ως παράμετρο.

Αναφορές

Last updated