4.3 KiB
EBP2Ret - Encadeamento de EBP
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial do PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
Informação Básica
Essa técnica explora a capacidade de manipular o Ponteiro Base (EBP) para encadear a execução de múltiplas funções por meio do uso cuidadoso do registro EBP e da sequência de instruções leave; ret
.
Como lembrete, leave
basicamente significa:
movl %ebp, %esp
popl %ebp
ret
E como o EBP está na pilha antes do EIP, é possível controlá-lo controlando a pilha.
EBP2Ret
Esta técnica é particularmente útil quando você pode alterar o registro EBP, mas não tem uma maneira direta de alterar o registro EIP. Ela aproveita o comportamento das funções quando terminam de executar.
Se, durante a execução de fvuln
, você conseguir injetar um EBP falso na pilha que aponta para uma área na memória onde está localizado o endereço do seu shellcode (mais 4 bytes para considerar a operação pop
), você pode controlar indiretamente o EIP. Quando fvuln
retorna, o ESP é definido para esta localização manipulada, e a subsequente operação pop
diminui o ESP em 4, fazendo com que ele aponte efetivamente para o seu shellcode. Quando a instrução ret
é executada, o controle é transferido para o seu shellcode.
Construção do Exploit
Primeiro, você precisa injetar seu shellcode em algum lugar em uma memória executável e obter o endereço, ou obter o endereço de um ONE_GADGET válido, ou fazer o ESP apontar para um local com o endereço do system()
seguido por 4 bytes de lixo e o endereço de "/bin/sh"
.
Em seguida, crie um preenchimento e comprometa o EBP com o endereço do shellcode/one_gadget - 4
. Deve ser -4
por causa do pop
. Em seguida, o ESP
estará apontando para o endereço desejado e o ret
será executado.
Exploit Off-By-One
Existe uma variante específica dessa técnica conhecida como "Exploit Off-By-One". É usada quando você pode apenas modificar o byte menos significativo do EBP. Nesse caso, o local de memória que armazena o endereço do shellcode deve compartilhar os três primeiros bytes com o EBP, permitindo uma manipulação semelhante com condições mais restritas.
EBP Chaining
Portanto, colocando um endereço controlado na entrada do EBP
da pilha e um endereço para leave; ret
em EIP
, é possível mover o ESP
para o endereço controlado do EBP
na pilha.
Agora, o ESP
é controlado apontando para um endereço desejado e a próxima instrução a ser executada é um RET
. Para abusar disso, é possível colocar neste local controlado do ESP o seguinte:
&(próximo EBP falso)
-> Carrega o novo EBP por causa dopop ebp
da instruçãoleave
system()
-> Chamado porret
&(leave;ret)
-> Chamado após o término do sistema, moverá o ESP para o EBP falso e começará novamente&("/bin/sh")
-> Parâmetro parasystem
Basicamente, dessa forma, é possível encadear vários EBPs falsos para controlar o fluxo do programa.
Para ser sincero, isso é como um ret2lib, mas mais complexo sem benefício aparente, mas poderia ser interessante em alguns casos específicos.