Ho un modulo vulnerabile del kernel di Linux (32-bit), che posso sfruttare con successo, e ho ottenuto privilegi da esso. Fondamentalmente, il mio exploit utilizza una catena ROP per disabilitare SMEP e salta direttamente al mio shellcode mappato su userland. Il mio codice shell in userland effettua una chiamata a commit_creds(prepare_kernel_creds(0));
e prova a tornare al mio codice userland.
Ora non capisco come tornare alla modalità utente dalla modalità kernel. Diversi articoli sottolineano che dovrei usare iret
istruzioni di assemblaggio per tornare alla modalità utente. Ho inserito un iret
dopo lo shellcode, ma non sembra funzionare.
Scrivo su un file del dispositivo e dalla traccia della chiamata:
? vfs_write
? SyS_write
? do_fast_syscall_32
? entry_SYSENTER_32
Prendo atto che si tratta di una chiamata di sistema veloce e che deve ritornare attraverso l'istruzione sysexit
.
Ora, come posso tornare su userland senza mettere nel panico il kernel? Ho bisogno di sapere quale chiamata devo eseguire ( iret
/ sysexit
) e come eseguirla in modo pulito.
(Ho dato un'occhiata ai manuali di Intel e ad un sacco di altre risorse, ma nulla mi ha aiutato molto fino ad ora.)