SROP - Sigreturn-Oriented Programming
Informazioni di base
Sigreturn
è una speciale syscall 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, mette temporaneamente in pausa il suo lavoro corrente per gestire il segnale con un gestore di segnali, una funzione speciale progettata per gestire i segnali.
Dopo che il gestore di segnali ha finito, il programma deve ripristinare 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 pulendo il frame dello stack (la sezione di memoria che memorizza le chiamate alle funzioni e le variabili locali) che è stato 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 efficacemente i registri della CPU al loro stato prima che il segnale fosse gestito. Questo include il registro del puntatore dello stack (RSP), che punta alla cima attuale dello stack.
Chiamando la syscall sigreturn
da una catena ROP e aggiungendo i valori dei registri che vorremmo che caricasse 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 altri Ret2syscalls:
pageRet2syscallSe sei curioso, questa è la struttura sigcontext memorizzata nello stack per recuperare successivamente i valori (diagramma da qui):
Per una spiegazione più dettagliata, controlla anche:
Esempio
Puoi trovare un esempio qui dove la chiamata a signeturn è costruita tramite ROP (inserendo 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 costruire un ROP:
Altri Esempi e Riferimenti
File binario in assembly che consente di scrivere nello stack e poi chiama la syscall
sigreturn
. È possibile scrivere nello stack una ret2syscall tramite una struttura sigreturn e leggere la flag che si trova nella memoria del binario.File binario in assembly che consente di scrivere nello stack e poi chiama la syscall
sigreturn
. È possibile scrivere nello stack una ret2syscall tramite una struttura sigreturn (il binario contiene la stringa/bin/sh
).64 bit, no relro, no canary, nx, no pie. Semplice buffer overflow che sfrutta la funzione
gets
con la mancanza di gadget che esegue una ret2syscall. La catena ROP scrive/bin/sh
nella.bss
chiamando di nuovo gets, sfrutta la funzionealarm
per impostare eax a0xf
per chiamare un SROP ed eseguire una shell.Programma in assembly a 64 bit, no relro, no canary, nx, no pie. Il flusso consente di scrivere nello stack, controllare diversi registri, chiamare una syscall e poi chiamare
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 surwx
e impostare l'ESP nello spazio binario. Seguendo il flusso, il programma chiamerà nuovamente read in ESP, ma in questo caso ESP punterà alla prossima istruzione quindi passando un shellcode lo scriverà come prossima istruzione ed eseguirà.SROP viene utilizzato per concedere privilegi di esecuzione (memprotect) al luogo in cui è stato inserito un shellcode.
Last updated