La mia comprensione (certamente incompleta) di un sistema remoto compromesso a livello di codice binario è approssimativamente:
- Una vulnerabilità del programma, come la mancata convalida dell'input, viene sfruttata per inserire lo shellcode esterno nel sistema di destinazione.
- Il flusso del programma viene deviato per eseguire lo shellcode, ad es. sovrascrivendo gli indirizzi di ritorno nello stack di chiamate.
- L'utente malintenzionato può ora eseguire codice arbitrario sul sistema di destinazione con i privilegi del processo compromesso.
Supponiamo che siano presenti meccanismi di protezione a livello di sistema, in particolare:
- Tutti i segmenti di dati non sono eseguibili
- Tutti i segmenti di codice sono contrassegnati come di sola lettura
- Il codice è costruito con contrassegni indurenti, come protezione dello stack, controllo della dimensione dell'input, ecc.
In che modo è ancora possibile ottenere il controllo del processo di destinazione (tramite un attacco a livello di codice macchina) in queste condizioni? Come può essere eseguito lo shellcode quando i segmenti di codice non possono essere modificati e i segmenti di dati non possono essere eseguiti?