8 KiB
Εκτέλεση Κώδικα με Αυθαίρετη Εγγραφή - __malloc_hook & __free_hook
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια στο GitHub.
Αγκίστρι Malloc
Όπως μπορείτε να δείτε στην επίσημη σελίδα του GNU, η μεταβλητή __malloc_hook
είναι ένας δείκτης που δείχνει στη διεύθυνση μιας συνάρτησης που θα κληθεί κάθε φορά που καλείται η malloc()
αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα One Gadget για παράδειγμα και κληθεί η malloc
, το One Gadget θα κληθεί.
Για να κληθεί η malloc είναι δυνατόν να περιμένετε το πρόγραμμα να την καλέσει ή με το να καλέσετε printf("%10000$c")
το οποίο δεσμεύει πολλά bytes κάνοντας την libc
να καλέσει την malloc για να τα δεσμεύσει στη στοίβα.
Περισσότερες πληροφορίες για το One Gadget στο:
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
{% hint style="warning" %} Σημειώστε ότι τα αγκίστρια είναι απενεργοποιημένα για GLIBC >= 2.34. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε μοντέρνες εκδόσεις του GLIBC. Δείτε: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md. {% endhint %}
Αγκίστρι Free
Αυτό καταχράστηκε σε ένα από τα παραδείγματα από τη σελίδα κατάχρησης ενός γρήγορου bin μετά από κατάχρηση ενός μη ταξινομημένου bin επίθεσης:
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %} unsorted-bin-attack.md {% endcontent-ref %}
Είναι δυνατόν να βρεθεί η διεύθυνση του __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
ως παράμετρο.