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 es una técnica de hacking utilizada cuando intentas tomar control de un programa pero no puedes encontrar los gadgets que normalmente usas para manipular el comportamiento del programa.
Cuando un programa utiliza ciertas bibliotecas (como libc), tiene algunas funciones integradas para gestionar cómo diferentes partes del programa se comunican entre sí. Entre estas funciones hay algunas joyas ocultas que pueden actuar como nuestros gadgets faltantes, especialmente una llamada __libc_csu_init
.
En __libc_csu_init
, hay dos secuencias de instrucciones (gadgets) que destacan:
La primera secuencia nos permite configurar valores en varios registros (rbx, rbp, r12, r13, r14, r15). Estos son como espacios donde podemos almacenar números o direcciones que queremos usar más tarde.
Este gadget nos permite controlar estos registros al sacar valores de la pila y colocarlos en ellos.
La segunda secuencia utiliza los valores que configuramos para hacer un par de cosas:
Mover valores específicos a otros registros, preparándolos para que los usemos como parámetros en funciones.
Realizar una llamada a una ubicación determinada al sumar los valores en r15 y rbx, y luego multiplicar rbx por 8.
Tal vez no conozcas ninguna dirección a la que escribir allí y necesitas una instrucción ret
. Ten en cuenta que el segundo gadget también terminará en un ret
, pero necesitarás cumplir con algunas condiciones para alcanzarlo:
Las condiciones serán:
[r12 + rbx*8]
debe apuntar a una dirección que almacene una función callable (si no hay idea y no hay pie, puedes usar simplemente la función _init
):
Si _init está en 0x400560
, usa GEF para buscar un puntero en la memoria hacia ella y hacer que [r12 + rbx*8]
sea la dirección con el puntero a _init:
rbp
y rbx
deben tener el mismo valor para evitar el salto
Hay algunos pops omitidos que necesitas tener en cuenta
Otra forma de controlar rdi
y rsi
desde el gadget ret2csu es accediendo a sus offsets específicos:
Consulta esta página para más información:
BROP - Blind Return Oriented ProgrammingImagina que quieres hacer una syscall o llamar a una función como write()
, pero necesitas valores específicos en los registros rdx
y rsi
como parámetros. Normalmente, buscarías gadgets que configuren estos registros directamente, pero no puedes encontrar ninguno.
Aquí es donde ret2csu entra en juego:
Configura los Registros: Usa el primer gadget mágico para sacar valores de la pila y colocarlos en rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) y r15.
Usa el Segundo Gadget: Con esos registros configurados, usas el segundo gadget. Esto te permite mover tus valores elegidos a rdx
y rsi
(desde r14 y r13, respectivamente), preparando los parámetros para una llamada a función. Además, al controlar r15
y rbx
, puedes hacer que el programa llame a una función ubicada en la dirección que calculas y colocas en [r15 + rbx*8]
.
Tienes un ejemplo usando esta técnica y explicándolo aquí, y este es el exploit final que utilizó:
Nota que el exploit anterior no está destinado a hacer un RCE
, está destinado a simplemente llamar a una función llamada win
(tomando la dirección de win
de stdin llamando a gets en la cadena ROP y almacenándola en r15) con un tercer argumento con el valor 0xdeadbeefcafed00d
.
El siguiente exploit fue extraído de esta página donde se utiliza ret2csu pero en lugar de usar la llamada, está eludiendo las comparaciones y alcanzando el ret
después de la llamada:
Por lo general, estos casos también son vulnerables a ret2plt + ret2lib, pero a veces necesitas controlar más parámetros de los que se pueden controlar fácilmente con los gadgets que encuentras directamente en libc. Por ejemplo, la función write()
requiere tres parámetros, y encontrar gadgets para establecer todos estos directamente puede no ser posible.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)