hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ebp2ret-ebp-chaining.md

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:

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 do pop ebp da instrução leave
  • system() -> Chamado por ret
  • &(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 para system

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.