hacktricks/binary-exploitation/libc-heap/house-of-force.md

7 KiB

House of Force

{% hint style="success" %} Impara e pratica l'Hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)

Sostieni HackTricks
{% endhint %}

Informazioni di Base

Codice

  • Questa tecnica è stata corretta (qui) e produce questo errore: malloc(): corrupted top size
  • Puoi provare il codice da qui per testarlo se vuoi.

Obiettivo

  • L'obiettivo di questo attacco è essere in grado di allocare un chunk in un indirizzo specifico.

Requisiti

  • Un overflow che permette di sovrascrivere la dimensione dell'intestazione del top chunk (es. -1).
  • Essere in grado di controllare la dimensione dell'allocazione dell'heap

Attacco

Se un attaccante vuole allocare un chunk nell'indirizzo P per sovrascrivere un valore qui. Inizia sovrascrivendo la dimensione del top chunk con -1 (forse con un overflow). Questo garantisce che malloc non utilizzerà mmap per nessuna allocazione poiché il Top chunk avrà sempre abbastanza spazio.

Successivamente, calcola la distanza tra l'indirizzo del top chunk e lo spazio target da allocare. Questo perché verrà eseguita un'allocazione malloc con quella dimensione per spostare il top chunk in quella posizione. In questo modo la differenza/dimensione può essere facilmente calcolata:

// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/

Pertanto, allocare una dimensione di target - old_top - 4*sizeof(long) (i 4 long sono a causa dei metadati del chunk superiore e del nuovo chunk quando allocato) sposterà il chunk superiore all'indirizzo che vogliamo sovrascrivere.
Successivamente, eseguire un'altra malloc per ottenere un chunk all'indirizzo target.

Riferimenti ed Altri Esempi