Ret2csu
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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 ocultas que podem agir como nossos gadgets ausentes, especialmente uma chamada __libc_csu_init
.
Em __libc_csu_init
, há duas sequências de instruções (gadgets) a serem destacadas:
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 mais tarde.
Este gadget nos permite controlar esses registradores ao retirar valores da pilha para eles.
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.
Realizar uma chamada para um local determinado pela soma dos valores em r15 e rbx, e então multiplicando rbx por 8.
Talvez você não conheça nenhum endereço para escrever lá e você precisa de uma instrução ret
. Note que o segundo gadget também terminará em um ret
, mas você precisará atender a algumas condições para alcançá-lo:
As condições serão:
[r12 + rbx*8]
deve apontar para um endereço que armazena uma função chamável (se não houver ideia e sem pie, você pode apenas usar a função _init
):
Se _init estiver em 0x400560
, use o GEF para procurar um ponteiro na memória para ele e faça com que [r12 + rbx*8]
seja o endereço com o ponteiro para _init:
rbp
e rbx
devem ter o mesmo valor para evitar o salto
Existem alguns pops omitidos que você precisa levar em conta
Outra maneira de controlar rdi
e rsi
a partir do gadget ret2csu é acessando offsets específicos:
Verifique esta página para mais informações:
Imagine que você deseja 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 definem esses registradores diretamente, mas não consegue encontrar nenhum.
É aqui que ret2csu entra em cena:
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.
Usar o Segundo Gadget: Com esses registradores configurados, você usa o segundo gadget. Isso permite mover 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 esta técnica e explicando aqui, e este é o exploit final que usou:
Note que o exploit anterior não é destinado a fazer um RCE
, é destinado apenas a 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
.
O seguinte exploit foi extraído desta página onde o ret2csu é usado, mas em vez de usar a chamada, está ignorando as comparações e alcançando o ret
após a chamada:
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.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)