House of Force
Informações Básicas
Código
Esta técnica foi corrigida (aqui) e produz este erro:
malloc(): corrupted top size
Você pode testar o código daqui se desejar.
Objetivo
O objetivo deste ataque é ser capaz de alocar um pedaço em um endereço específico.
Requisitos
Um estouro que permita sobrescrever o tamanho do cabeçalho do chunk superior (por exemplo, -1).
Ser capaz de controlar o tamanho da alocação do heap
Ataque
Se um atacante deseja alocar um chunk no endereço P para sobrescrever um valor aqui. Ele começa sobrescrevendo o tamanho do chunk superior com -1
(talvez com um estouro). Isso garante que o malloc não usará mmap para nenhuma alocação, pois o Top chunk sempre terá espaço suficiente.
Em seguida, calcule a distância entre o endereço do chunk superior e o espaço-alvo para alocar. Isso ocorre porque um malloc com esse tamanho será realizado para mover o chunk superior para essa posição. É assim que a diferença/tamanho pode ser facilmente calculada:
Portanto, alocar um tamanho de target - old_top - 4*sizeof(long)
(os 4 longs são devido aos metadados do chunk superior e do novo chunk quando alocado) moverá o chunk superior para o endereço que queremos sobrescrever.
Em seguida, faça outro malloc para obter um chunk no endereço alvo.
Referências e Outros Exemplos
O objetivo deste cenário é um ret2win onde precisamos modificar o endereço de uma função que será chamada pelo endereço da função ret2win
O binário tem um overflow que pode ser explorado para modificar o tamanho do top chunk, que é modificado para -1 ou p64(0xffffffffffffffff)
Em seguida, é calculado o endereço do local onde o ponteiro a ser sobrescrito existe, e a diferença da posição atual do top chunk até lá é alocada com
malloc
Finalmente, um novo chunk é alocado que conterá este alvo desejado dentro do qual é sobrescrito pela função ret2win
No
Input your name:
, há uma vulnerabilidade inicial que permite vazar um endereço do heapEm seguida, nas funcionalidades
Org:
eHost:
, é possível preencher os 64B do ponteiros
quando solicitado pelo nome da organização, que na pilha é seguido pelo endereço de v2, que é então seguido pelo nome do host indicado. Como então, strcpy vai copiar o conteúdo de s para um chunk de tamanho 64B, é possível sobrescrever o tamanho do top chunk com os dados inseridos no nome do host.Agora que a escrita arbitrária é possível, o GOT do
atoi
foi sobrescrito para o endereço do printf. Então foi possível vazar o endereço deIO_2_1_stderr
com%24$p
. E com esse vazamento do libc foi possível sobrescrever novamente o GOT doatoi
com o endereço dosystem
e chamá-lo passando como parâmetro/bin/sh
Um método alternativo proposto neste outro writeup, é sobrescrever
free
computs
, e então adicionar o endereço deatoi@got
, no ponteiro que será posteriormente liberado para que seja vazado e com esse vazamento sobrescrever novamenteatoi@got
comsystem
e chamá-lo com/bin/sh
.Existe um UAF que permite reutilizar um chunk que foi liberado sem limpar o ponteiro. Como existem alguns métodos de leitura, é possível vazar um endereço do libc escrevendo um ponteiro para a função free no GOT aqui e então chamando a função de leitura.
Em seguida, House of force foi usado (abusando do UAF) para sobrescrever o tamanho do espaço à esquerda com um -1, alocar um chunk grande o suficiente para chegar ao hook de free e, em seguida, alocar outro chunk que conterá o hook de free. Em seguida, escreva no hook o endereço do
system
, escreva em um chunk"/bin/sh"
e finalmente libere o chunk com esse conteúdo de string.
Last updated