6.3 KiB
WWW2Exec - __malloc_hook & __free_hook
{{#include ../../banners/hacktricks-training.md}}
Malloc Hook
Όπως μπορείτε να δείτε στον Επίσημο ιστότοπο GNU, η μεταβλητή __malloc_hook είναι ένας δείκτης που δείχνει στη διεύθυνση μιας συνάρτησης που θα καλείται όποτε καλείται το malloc() αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα One Gadget για παράδειγμα και κληθεί το malloc, το One Gadget θα κληθεί.
Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με **καλώντας printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το libc` να καλέσει το malloc για να τα δεσμεύσει στο heap.
Περισσότερες πληροφορίες σχετικά με το One Gadget στο:
{{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}}
Warning
Σημειώστε ότι οι hooks είναι απενεργοποιημένες για GLIBC >= 2.34. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
Free Hook
Αυτό εκμεταλλεύτηκε σε ένα από τα παραδείγματα της σελίδας εκμεταλλευόμενος μια επίθεση γρήγορης bin μετά από την εκμετάλλευση μιας επίθεσης unsorted bin:
{{#ref}} ../libc-heap/unsorted-bin-attack.md {{#endref}}
Είναι δυνατόν να βρείτε τη διεύθυνση του __free_hook αν το δυαδικό αρχείο έχει σύμβολα με την ακόλουθη εντολή:
gef➤ p &__free_hook
Στην ανάρτηση μπορείτε να βρείτε έναν οδηγό βήμα προς βήμα για το πώς να εντοπίσετε τη διεύθυνση του free hook χωρίς σύμβολα. Ως σύνοψη, στη συνάρτηση free:
gef➤ x/20i free
0xf75dedc0 : push ebx
0xf75dedc1 : call 0xf768f625
0xf75dedc6 : add ebx,0x14323a
0xf75dedcc : sub esp,0x8
0xf75dedcf : mov eax,DWORD PTR [ebx-0x98]
0xf75dedd5 : mov ecx,DWORD PTR [esp+0x10]
0xf75dedd9 : mov eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb : test eax,eax ;<
0xf75deddd : jne 0xf75dee50
Στο αναφερόμενο σημείο διακοπής στον προηγούμενο κώδικα, στο $eax θα βρίσκεται η διεύθυνση του free hook.
Τώρα εκτελείται μια fast bin attack:
- Πρώτα απ' όλα, ανακαλύπτεται ότι είναι δυνατό να εργαστούμε με γρήγορες chunks μεγέθους 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
- Εάν καταφέρουμε να αποκτήσουμε μια γρήγορη chunk μεγέθους 0x200 σε αυτή την τοποθεσία, θα είναι δυνατό να αντικαταστήσουμε έναν δείκτη συνάρτησης που θα εκτελείται
- Για αυτό, δημιουργείται μια νέα chunk μεγέθους
0xfcκαι καλείται η συγχωνευμένη συνάρτηση με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε μια ελεύθερη chunk μεγέθους0xfc*2 = 0x1f8στο fast bin. - Στη συνέχεια, καλείται η συνάρτηση edit σε αυτή την chunk για να τροποποιήσει τη διεύθυνση
fdαυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση__free_hook. - Στη συνέχεια, δημιουργείται μια chunk με μέγεθος
0x1f8για να ανακτηθεί από το fast bin η προηγούμενη άχρηστη chunk, ώστε να δημιουργηθεί άλλη μια chunk μεγέθους0x1f8για να αποκτήσουμε μια γρήγορη chunk στο__free_hookπου αντικαθίσταται με τη διεύθυνση της συνάρτησηςsystem. - Και τελικά, μια chunk που περιέχει τη συμβολοσειρά
/bin/sh\x00απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση__free_hookπου δείχνει στη system με/bin/sh\x00ως παράμετρο.
Αναφορές
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
- https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
{{#include ../../banners/hacktricks-training.md}}