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

8.1 KiB

House of Force

{% hint style="success" %} Aprende y practica Hacking en AWS: HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks
{% endhint %}

Información Básica

Código

  • Esta técnica fue parcheada (aquí) y produce este error: malloc(): corrupted top size
  • Puedes probar el código desde aquí para probarlo si lo deseas.

Objetivo

  • El objetivo de este ataque es poder asignar un fragmento en una dirección específica.

Requisitos

  • Un desbordamiento que permita sobrescribir el tamaño del encabezado del fragmento superior (por ejemplo, -1).
  • Poder controlar el tamaño de la asignación del montón (heap).

Ataque

Si un atacante desea asignar un fragmento en la dirección P para sobrescribir un valor aquí. Comienza sobrescribiendo el tamaño del fragmento superior con -1 (quizás con un desbordamiento). Esto asegura que malloc no utilizará mmap para ninguna asignación, ya que el fragmento superior siempre tendrá suficiente espacio.

Luego, calcula la distancia entre la dirección del fragmento superior y el espacio objetivo para asignar. Esto se debe a que se realizará una asignación malloc con ese tamaño para mover el fragmento superior a esa posición. Así es como se puede calcular fácilmente la diferencia/tamaño:

// 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)
*/

Por lo tanto, asignar un tamaño de objetivo - old_top - 4*sizeof(long) (los 4 longs son debido a los metadatos del chunk superior y del nuevo chunk cuando se asigna) moverá el chunk superior a la dirección que queremos sobrescribir.
Luego, hacer otro malloc para obtener un chunk en la dirección objetivo.

Referencias y Otros Ejemplos

{% hint style="success" %} Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks
{% endhint %}