Ret2plt
Informações Básicas
O objetivo desta técnica seria vazar um endereço de uma função do PLT para poder contornar o ASLR. Isso ocorre porque, por exemplo, se você vazar o endereço da função puts
da libc, você pode então calcular onde está a base da libc
e calcular offsets para acessar outras funções como system
.
Isso pode ser feito com um payload pwntools
como (aqui):
Observe como o puts
(usando o endereço do PLT) é chamado com o endereço do puts
localizado na GOT (Tabela de Deslocamento Global). Isso ocorre porque, no momento em que o puts
imprime a entrada da GOT do puts
, esta entrada conterá o endereço exato do puts
na memória.
Também observe como o endereço do main
é usado no exploit, para que quando o puts
encerre sua execução, o binário chame main
novamente em vez de sair (para que o endereço vazado continue válido).
Observe que, para que isso funcione, o binário não pode ser compilado com PIE ou você deve ter encontrado um vazamento para contornar o PIE a fim de saber o endereço do PLT, GOT e main. Caso contrário, você precisará contornar o PIE primeiro.
Você pode encontrar um exemplo completo desse contorno aqui. Este foi o exploit final desse exemplo:
Outros exemplos e Referências
64 bits, ASLR ativado mas sem PIE, o primeiro passo é preencher um estouro de buffer até o byte 0x00 do canário e então chamar puts para vazá-lo. Com o canário, um ROP gadget é criado para chamar puts e vazar o endereço de puts da GOT e um ROP gadget para chamar
system('/bin/sh')
.64 bits, ASLR ativado, sem canário, estouro de pilha em main a partir de uma função filha. ROP gadget para chamar puts e vazar o endereço de puts da GOT e então chamar um one gadget.
Last updated