House of Force
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:
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
El objetivo de este escenario es un ret2win donde necesitamos modificar la dirección de una función que será llamada por la dirección de la función ret2win
El binario tiene un desbordamiento que puede ser abusado para modificar el tamaño del chunk superior, que se modifica a -1 o p64(0xffffffffffffffff)
Luego, se calcula la dirección donde existe el puntero a sobrescribir, y la diferencia desde la posición actual del chunk superior hasta allí se asigna con
malloc
Finalmente se asigna un nuevo chunk que contendrá este objetivo deseado en el que se sobrescribe con la función ret2win
En
Input your name:
hay una vulnerabilidad inicial que permite filtrar una dirección del heapLuego en la funcionalidad
Org:
yHost:
es posible llenar los 64B del punteros
cuando se solicita el nombre de la organización, que en la pila es seguido por la dirección de v2, que luego es seguido por el nombre del host indicado. Como entonces, strcpy va a copiar el contenido de s a un chunk de tamaño 64B, es posible sobrescribir el tamaño del chunk superior con los datos introducidos dentro del nombre del host.Ahora que la escritura arbitraria es posible, el GOT de
atoi
fue sobrescrito a la dirección de printf. entonces fue posible filtrar la dirección deIO_2_1_stderr
con%24$p
. Y con esta filtración de libc fue posible sobrescribir nuevamente el GOT deatoi
con la dirección desystem
y llamarlo pasando como parámetro/bin/sh
Un método alternativo propuesto en este otro writeup, es sobrescribir
free
conputs
, y luego agregar la dirección deatoi@got
, en el puntero que luego será liberado para que se filtre y con esta filtración sobrescribir nuevamenteatoi@got
consystem
y llamarlo con/bin/sh
.Hay un UAF que permite reutilizar un chunk que fue liberado sin borrar el puntero. Debido a que hay algunos métodos de lectura, es posible filtrar una dirección de libc escribiendo un puntero a la función free en el GOT aquí y luego llamando a la función de lectura.
Luego, se utilizó House of force (abusando del UAF) para sobrescribir el tamaño del espacio izquierdo con un -1, asignar un chunk lo suficientemente grande para llegar al hook de free, y luego asignar otro chunk que contendrá el hook de free. Luego, escribir en el hook la dirección de
system
, escribir en un chunk"/bin/sh"
y finalmente liberar el chunk con ese contenido de cadena.
Last updated