House of Einherjar
Información Básica
Código
Revisa el ejemplo en https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c
O en https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation (puede ser necesario llenar la tcache)
Objetivo
El objetivo es asignar memoria en casi cualquier dirección específica.
Requisitos
Crear un chunk falso cuando queremos asignar un chunk:
Establecer punteros para que apunten a sí mismos y evadir las comprobaciones de integridad
Desbordar un byte con un byte nulo de un chunk al siguiente para modificar la bandera
PREV_INUSE
.Indicar en el
prev_size
del chunk abusado por el off-by-null la diferencia entre él mismo y el chunk falso.El tamaño del chunk falso también debe haber sido establecido en el mismo tamaño para evadir las comprobaciones de integridad.
Para construir estos chunks, necesitarás una fuga de heap.
Ataque
Se crea un chunk falso dentro de un chunk controlado por el atacante apuntando con
fd
ybk
al chunk original para evadir protecciones.Se asignan 2 otros chunks (
B
yC
).Abusando del off-by-one en el chunk
B
, se limpia el bitprev in use
y se sobrescribe los datos deprev_size
con la diferencia entre el lugar donde se asigna el chunkC
, al chunk falsoA
generado antes.Este
prev_size
y el tamaño en el chunk falsoA
deben ser iguales para evadir las comprobaciones.Luego, se llena la tcache.
Luego, se libera
C
para que se consolide con el chunk falsoA
.Luego, se crea un nuevo chunk
D
que comenzará en el chunk falsoA
y cubrirá el chunkB
.La casa de Einherjar termina aquí.
Esto puede continuar con un ataque de fast bin o envenenamiento de Tcache:
Liberar
B
para agregarlo al fast bin / TcacheSe sobrescribe el
fd
deB
haciendo que apunte a la dirección objetivo abusando del chunkD
(ya que contieneB
dentro)Luego, se realizan 2 mallocs y el segundo va a estar asignando la dirección objetivo
Referencias y otros ejemplos
Después de liberar punteros, no se anulan, por lo que aún es posible acceder a sus datos. Por lo tanto, se coloca un chunk en el bin no ordenado y se filtran los punteros que contiene (fuga de libc) y luego se coloca un nuevo heap en el bin no ordenado y se filtra una dirección de heap del puntero que obtiene.
Error de desbordamiento de byte nulo en
strtok
.Usa House of Einherjar para obtener una situación de chunks superpuestos y termina con envenenamiento de Tcache para obtener un primitivo de escritura arbitraria.
Last updated