SROP - Sigreturn-Oriented Programming
Basic Information
Sigreturn
è una syscall speciale utilizzata principalmente per ripulire dopo che un gestore di segnali ha completato la sua esecuzione. I segnali sono interruzioni inviate a un programma dal sistema operativo, spesso per indicare che si è verificata una situazione eccezionale. Quando un programma riceve un segnale, interrompe temporaneamente il suo lavoro attuale per gestire il segnale con un gestore di segnali, una funzione speciale progettata per gestire i segnali.
Dopo che il gestore di segnali ha terminato, il programma deve riprendere il suo stato precedente come se nulla fosse accaduto. Qui entra in gioco sigreturn
. Aiuta il programma a tornare dal gestore di segnali e ripristina lo stato del programma ripulendo il frame dello stack (la sezione di memoria che memorizza le chiamate di funzione e le variabili locali) utilizzato dal gestore di segnali.
La parte interessante è come sigreturn
ripristina lo stato del programma: lo fa memorizzando tutti i valori dei registri della CPU nello stack. Quando il segnale non è più bloccato, sigreturn
estrae questi valori dallo stack, ripristinando effettivamente i registri della CPU al loro stato precedente alla gestione del segnale. Questo include il registro del puntatore dello stack (RSP), che punta all'attuale cima dello stack.
Chiamando la syscall sigreturn
da una catena ROP e aggiungendo i valori dei registri che vorremmo caricare nello stack, è possibile controllare tutti i valori dei registri e quindi chiamare ad esempio la syscall execve
con /bin/sh
.
Nota come questo sarebbe un tipo di Ret2syscall che rende molto più facile controllare i parametri per chiamare altre Ret2syscall:
Ret2syscallSe sei curioso, questa è la struttura sigcontext memorizzata nello stack per recuperare successivamente i valori (diagramma da qui):
Per una spiegazione migliore controlla anche:
Esempio
Puoi trovare un esempio qui dove la chiamata a signeturn è costruita tramite ROP (mettendo in rxa il valore 0xf
), anche se questo è l'exploit finale da lì:
Controlla anche l' exploit da qui dove il binario stava già chiamando sigreturn
e quindi non è necessario costruirlo con un ROP:
Altri Esempi & Riferimenti
Assembly binary che consente di scrivere nello stack e poi chiama la syscall
sigreturn
. È possibile scrivere nello stack un ret2syscall tramite una struttura sigreturn e leggere il flag che si trova nella memoria del binary.Assembly binary che consente di scrivere nello stack e poi chiama la syscall
sigreturn
. È possibile scrivere nello stack un ret2syscall tramite una struttura sigreturn (il binary ha la stringa/bin/sh
).64 bit, no relro, no canary, nx, no pie. Semplice buffer overflow che sfrutta la funzione
gets
con mancanza di gadget che esegue un ret2syscall. La catena ROP scrive/bin/sh
nella.bss
richiamando di nuovo gets, sfrutta la funzionealarm
per impostare eax a0xf
per chiamare un SROP ed eseguire una shell.Programma assembly a 64 bit, no relro, no canary, nx, no pie. Il flusso consente di scrivere nello stack, controllare diversi registri e chiamare una syscall e poi chiama
exit
. La syscall selezionata è unsigreturn
che imposterà i registri e sposteràeip
per chiamare un'istruzione syscall precedente ed eseguirememprotect
per impostare lo spazio binario arwx
e impostare l'ESP nello spazio binario. Seguendo il flusso, il programma chiamerà di nuovo read in ESP, ma in questo caso ESP punterà alla prossima istruzione quindi passando un shellcode lo scriverà come la prossima istruzione ed eseguirà.SROP è utilizzato per dare privilegi di esecuzione (memprotect) al luogo dove è stato posizionato un shellcode.
Last updated