5.9 KiB

House of Force

{{#include ../../banners/hacktricks-training.md}}

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 de aquí para testearlo si lo deseas.

Objetivo

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

Requisitos

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

Ataque

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

Luego, calcula la distancia entre la dirección del chunk superior y el espacio objetivo para asignar. Esto se debe a que se realizará un malloc con ese tamaño para mover el chunk 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 target - old_top - 4*sizeof(long) (los 4 longs son por los metadatos del chunk superior y del nuevo chunk cuando se asigna) moverá el chunk superior a la dirección que queremos sobrescribir.
Luego, haz otro malloc para obtener un chunk en la dirección objetivo.

Referencias y Otros Ejemplos

{{#include ../../banners/hacktricks-training.md}}