Tengo un módulo vulnerable de Kernel de Linux (32 bits), que puedo explotar con éxito, y he ganado privilegios con él. Básicamente, mi exploit usa una cadena de ROP para deshabilitar SMEP, y salta directamente a mi shellcode asignado en la zona de usuario. Mi código de shell en userland realiza una llamada a commit_creds(prepare_kernel_creds(0));
e intenta volver a mi código de usuario.
Ahora no entiendo cómo volver al modo de usuario desde el modo kernel. Varios artículos señalan que debo usar las instrucciones de ensamblado de iret
para volver al modo usuario. Inserté claramente un iret
después del código de shell, pero parece que no funciona.
Escribo en un archivo de dispositivo, y desde el rastreo de llamadas:
? vfs_write
? SyS_write
? do_fast_syscall_32
? entry_SYSENTER_32
Observo que esta es una llamada rápida al sistema, y debe regresar a través de la instrucción sysexit
.
Ahora, ¿cómo vuelvo a userland sin entrar en pánico en el kernel? Necesito saber qué llamada debo realizar ( iret
/ sysexit
) y cómo realizarla de forma limpia.
(He revisado los manuales de Intel y un montón de otros recursos, pero nada me ha ayudado mucho hasta ahora).