Large Bin Attack
Informações Básicas
Para mais informações sobre o que é um large bin, consulte esta página:
Bins & Memory AllocationsÉ possível encontrar um ótimo exemplo em how2heap - large bin attack.
Basicamente, aqui você pode ver como, na última versão "atual" do glibc (2.35), não é verificado: P->bk_nextsize
permitindo modificar um endereço arbitrário com o valor de um chunk de large bin se certas condições forem atendidas.
Nesse exemplo, você pode encontrar as seguintes condições:
Um chunk grande é alocado
Um chunk grande menor que o primeiro, mas no mesmo índice, é alocado
Deve ser menor para que vá primeiro no bin
(Um chunk para evitar a fusão com o chunk superior é criado)
Em seguida, o primeiro chunk grande é liberado e um novo chunk maior do que ele é alocado -> Chunk1 vai para o large bin
Em seguida, o segundo chunk grande é liberado
Agora, a vulnerabilidade: O atacante pode modificar
chunk1->bk_nextsize
para[target-0x20]
Em seguida, um chunk maior que o chunk 2 é alocado, então o chunk2 é inserido no large bin sobrescrevendo o endereço
chunk1->bk_nextsize->fd_nextsize
com o endereço do chunk2
Existem outros cenários potenciais, a ideia é adicionar ao large bin um chunk que seja menor que um chunk X atual no bin, para que ele precise ser inserido imediatamente antes dele no bin, e precisamos ser capazes de modificar o bk_nextsize
de X, pois é onde o endereço do chunk menor será escrito.
Este é o código relevante do malloc. Comentários foram adicionados para entender melhor como o endereço foi sobrescrito:
Isso poderia ser usado para sobrescrever a variável global global_max_fast
da libc para então explorar um ataque de fast bin com chunks maiores.
Você pode encontrar outra ótima explicação desse ataque em guyinatuxedo.
Outros exemplos
Ataque de large bin na mesma situação conforme aparece em how2heap.
A primitiva de escrita é mais complexa, porque
global_max_fast
é inútil aqui.FSOP é necessário para finalizar o exploit.
Last updated