House of Einherjar
Informações Básicas
Código
Verifique o exemplo em https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c
Ou em https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation (talvez seja necessário preencher o tcache)
Objetivo
O objetivo é alocar memória em quase qualquer endereço específico.
Requisitos
Criar um chunk falso quando queremos alocar um chunk:
Definir ponteiros para apontar para si mesmo para contornar verificações de integridade
Estouro de um byte com um byte nulo de um chunk para o próximo para modificar a flag
PREV_INUSE
.Indicar no
prev_size
do chunk abusado por off-by-null a diferença entre ele mesmo e o chunk falso.O tamanho do chunk falso também deve ter sido definido com o mesmo tamanho para contornar verificações de integridade.
Para construir esses chunks, você precisará de um vazamento de heap.
Ataque
Um chunk falso é criado dentro de um chunk controlado pelo atacante apontando com
fd
ebk
para o chunk original para contornar proteções.2 outros chunks (
B
eC
) são alocados.Abusando do off-by-one no
B
, o bitprev in use
é limpo e os dadosprev_size
são sobrescritos com a diferença entre o local onde o chunkC
é alocado e o chunk falsoA
gerado anteriormente.Este
prev_size
e o tamanho no chunk falsoA
devem ser iguais para contornar verificações.Em seguida, o tcache é preenchido.
Em seguida,
C
é liberado para que se consolide com o chunk falsoA
.Em seguida, um novo chunk
D
é criado que começará no chunk falsoA
e cobrirá o chunkB
.A casa de Einherjar termina aqui.
Isso pode ser continuado com um ataque de fast bin ou envenenamento de Tcache:
Libere
B
para adicioná-lo ao fast bin / TcacheO
fd
deB
é sobrescrito fazendo-o apontar para o endereço alvo abusando do chunkD
(pois ele contémB
dentro)Em seguida, são feitos 2 mallocs e o segundo vai alocar o endereço alvo
Referências e outros exemplos
Após liberar ponteiros, eles não são nulificados, então ainda é possível acessar seus dados. Portanto, um chunk é colocado no unsorted bin e vazados os ponteiros que ele contém (vazamento de libc) e então um novo heap é colocado no unsorted bin e vazado um endereço de heap a partir do ponteiro que ele recebe.
Bug de estouro de byte nulo em
strtok
.Use a Casa de Einherjar para obter uma situação de chunks sobrepostos e termine com envenenamento de Tcache para obter um primitivo de escrita arbitrário.
Last updated