mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e
This commit is contained in:
parent
d3d2abb74b
commit
1dce7cda39
1 changed files with 35 additions and 10 deletions
|
@ -6,7 +6,7 @@
|
|||
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -30,14 +30,14 @@ E como o **EBP está na pilha** antes do EIP, é possível controlá-lo controla
|
|||
|
||||
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 bytes, **fazendo com que ele aponte efetivamente para um endereço armazenado pelo atacante lá.**\
|
||||
Observe como você **precisa saber 2 endereços**: Onde o ESP vai, onde você precisará escrever o endereço apontado pelo ESP.
|
||||
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 um endereço armazenado pelo atacante lá.**\
|
||||
Observe como você **precisa saber de 2 endereços**: Onde o ESP vai chegar, onde você precisará escrever o endereço apontado pelo ESP.
|
||||
|
||||
#### Construção do Exploit
|
||||
|
||||
Primeiro, você precisa saber um **endereço onde pode escrever dados / endereços arbitrários**. O ESP apontará aqui e **executará o primeiro `ret`**.
|
||||
Primeiro, você precisa saber de um **endereço onde pode escrever dados / endereços arbitrários**. O ESP apontará aqui e **executará o primeiro `ret`**.
|
||||
|
||||
Em seguida, você precisa saber o endereço usado pelo `ret` que **executará código arbitrário**. Você poderia usar:
|
||||
Em seguida, você precisa saber o endereço usado pelo `ret` que irá **executar código arbitrário**. Você poderia usar:
|
||||
|
||||
* Um endereço válido de [**ONE\_GADGET**](https://github.com/david942j/one\_gadget).
|
||||
* O endereço de **`system()`** seguido por **4 bytes de lixo** e o endereço de `"/bin/sh"` (bits x86).
|
||||
|
@ -66,7 +66,7 @@ Agora, o **`ESP`** é controlado apontando para um endereço desejado e a próxi
|
|||
|
||||
Basicamente, dessa forma é possível encadear vários EBPs falsos para controlar o fluxo do programa.
|
||||
|
||||
Isso é como um [ret2lib](../rop-return-oriented-programing/ret2lib/), mas mais complexo sem benefício aparente, mas poderia ser interessante em alguns casos extremos.
|
||||
Isso é como um [ret2lib](../rop-return-oriented-programing/ret2lib/), mas mais complexo sem benefício aparente, mas poderia ser interessante em alguns casos específicos.
|
||||
|
||||
Além disso, aqui está um [**exemplo de um desafio**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) que usa essa técnica com um **vazamento de pilha** para chamar uma função vencedora. Este é o payload final da página:
|
||||
```python
|
||||
|
@ -106,7 +106,7 @@ print(p.recvline())
|
|||
```
|
||||
## EBP pode não ser usado
|
||||
|
||||
Como [**explicado neste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), se um binário é compilado com algumas otimizações, o **EBP nunca chega a controlar o ESP**, portanto, qualquer exploit que funcione controlando o EBP basicamente falhará porque não tem nenhum efeito real.\
|
||||
Conforme [**explicado neste post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), se um binário é compilado com algumas otimizações, o **EBP nunca chega a controlar o ESP**, portanto, qualquer exploit que funcione controlando o EBP basicamente falhará porque não tem nenhum efeito real.\
|
||||
Isso ocorre porque o **prólogo e epílogo mudam** se o binário for otimizado.
|
||||
|
||||
* **Não otimizado:**
|
||||
|
@ -204,9 +204,34 @@ Verifique a técnica ret2esp aqui:
|
|||
|
||||
## ARM64
|
||||
|
||||
No ARM64, os **prólogos e epílogos** das funções **não armazenam e recuperam o registro SP** na pilha. Portanto, por padrão, você **não poderá controlar o registro SP** sobrescrevendo alguns dados dentro da pilha.
|
||||
No ARM64, os **prólogos e epílogos** das funções **não armazenam e recuperam o registro SP** na pilha. Além disso, a instrução **`RET`** não retorna para o endereço apontado por SP, mas **para o endereço dentro de `x30`**.
|
||||
|
||||
Portanto, por padrão, apenas abusar do epílogo você **não será capaz de controlar o registro SP** sobrescrevendo alguns dados dentro da pilha. E mesmo que você consiga controlar o SP, ainda precisaria de uma maneira de **controlar o registro `x30`**.
|
||||
|
||||
* prólogo
|
||||
|
||||
```armasm
|
||||
sub sp, sp, 16
|
||||
stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30
|
||||
mov x29, sp // FP aponta para o registro de quadro
|
||||
```
|
||||
* epílogo
|
||||
|
||||
```armasm
|
||||
ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8]
|
||||
add sp, sp, 16
|
||||
ret
|
||||
```
|
||||
|
||||
{% hint style="danger" %}
|
||||
A maneira de realizar algo semelhante ao pivoteamento de pilha em ARM64 seria ser capaz de **controlar o `SP`** (controlando algum registro cujo valor é passado para `SP` ou porque por algum motivo `SP` está pegando seu endereço da pilha e temos um estouro) e então **abusar do epílogo** para carregar o registro **`x30`** de um **`SP` controlado** e **`RET`** para ele.
|
||||
{% endhint %}
|
||||
|
||||
Também na página a seguir você pode ver o equivalente de **Ret2esp em ARM64**:
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %}
|
||||
[ret2esp-ret2reg.md](../rop-return-oriented-programing/ret2esp-ret2reg.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -214,8 +239,8 @@ No ARM64, os **prólogos e epílogos** das funções **não armazenam e recupera
|
|||
|
||||
Outras maneiras de apoiar o HackTricks:
|
||||
|
||||
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenha o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
|
Loading…
Reference in a new issue