Ret2syscall
Información Básica
Esto es similar a Ret2lib, sin embargo, en este caso no estaremos llamando a una función de una biblioteca. En este caso, todo estará preparado para llamar a la syscall sys_execve
con algunos argumentos para ejecutar /bin/sh
. Esta técnica se realiza generalmente en binarios que están compilados estáticamente, por lo que puede haber muchos gadgets e instrucciones de syscall.
Para preparar la llamada a la syscall se necesita la siguiente configuración:
rax: 59 Especificar sys_execve
rdi: ptr a "/bin/sh" especificar archivo a ejecutar
rsi: 0 especificar que no se pasan argumentos
rdx: 0 especificar que no se pasan variables de entorno
Así que, básicamente, se necesita escribir la cadena /bin/sh
en algún lugar y luego realizar la syscall
(teniendo en cuenta el padding necesario para controlar la pila). Para esto, necesitamos un gadget para escribir /bin/sh
en un área conocida.
Otra syscall interesante para llamar es mprotect
que permitiría a un atacante modificar los permisos de una página en memoria. Esto se puede combinar con ret2shellcode.
Gadgets de Registro
Comencemos por encontrar cómo controlar esos registros:
Con estas direcciones es posible escribir el contenido en la pila y cargarlo en los registros.
Escribir cadena
Memoria escribible
Primero necesitas encontrar un lugar escribible en la memoria.
Escribir cadena en memoria
Luego necesitas encontrar una manera de escribir contenido arbitrario en esta dirección.
Automatizar la cadena ROP
El siguiente comando crea una cadena ROP completa sys_execve
dada una binario estático cuando hay gadgets de write-what-where e instrucciones de syscall:
32 bits
64 bits
Falta de Gadgets
Si te faltan gadgets, por ejemplo para escribir /bin/sh
en memoria, puedes usar la técnica SROP para controlar todos los valores de los registros (incluyendo RIP y los registros de parámetros) desde la pila:
Ejemplo de Exploit
Otros Ejemplos y Referencias
64 bits, sin PIE, nx, escribir en alguna memoria un ROP para llamar a
execve
y saltar allí.64 bits, nx, sin PIE, escribir en alguna memoria un ROP para llamar a
execve
y saltar allí. Para escribir en la pila se abusa de una función que realiza operaciones matemáticas.64 bits, sin PIE, nx, BF canary, escribir en alguna memoria un ROP para llamar a
execve
y saltar allí.
Last updated