Non è necessario eseguire alcuna operazione di spinta dal momento che controlli già lo stack. Puoi avere i dati che desideri archiviare nei tuoi registri già posizionati dove puoi comodamente eseguire operazioni con loro.
In ROP, trovi una serie di frammenti di codice utili già presenti nel tuo programma di destinazione a cui puoi fare riferimento come gadget, che sono in genere le estremità di subroutine normali che eseguono operazioni necessarie per uno sfruttamento efficace. Allinea gli indirizzi dei gadget che desideri eseguire e i dati che desideri utilizzare con loro all'interno di una finta pila nella memoria che controlli prima di eseguire uno "stack pivot" per spostare il puntatore dello stack (esp in x86) in i tuoi dati.
Dopo che il puntatore dello stack è stato spostato nei tuoi dati, il controllo del programma sarà perso per il tuo stack falso al prossimo ret
. Quando questa istruzione viene eseguita, la parola / l'indirizzo in cima allo stack (0x100016f0 nel tuo esempio) verrà estratta e posizionata nel contatore del programma per reindirizzarla in un gadget sulla coda di alcune funzioni sembra pop eax; ret;
.
Se la parola successiva nello stack è 2) 0x01a19f7f (a value)
, il puntatore dello stack punta già a questi dati quando viene eseguita l'istruzione pop
, memorizzando questa parola nel registro eax.
Quindi, ret
per seguire immediatamente i popup del prossimo indirizzo del gadget ROP per continuare l'esecuzione.