No hay necesidad de realizar ninguna operación de inserción ya que ya controlas la pila. Puede tener los datos que desea almacenar dentro de sus registros ya colocados donde puede realizar operaciones con ellos de manera conveniente.
En ROP, encuentra una serie de fragmentos de código útiles ya presentes dentro de su programa objetivo a los que puede referirse como gadgets, que suelen ser los extremos de las subrutinas normales que realizan las operaciones que necesita para una explotación exitosa. Alinea las direcciones de los dispositivos que desea ejecutar y los datos que desea usar con ellos dentro de una pila falsa en la memoria que controla antes de realizar un "giro de pila" para mover el puntero de pila (especialmente en x86) hacia tus datos.
Después de que el puntero de pila se haya movido a sus datos, el control del programa se perderá en su pila falsa en el siguiente ret
. Cuando se ejecuta esta instrucción, la palabra / dirección superior en la pila (0x100016f0 en su ejemplo) se abrirá y se colocará en el contador del programa para redirigirla a un gadget en el extremo de la cola de una función que se parece a pop eax; ret;
.
Cuando la siguiente palabra en tu pila es 2) 0x01a19f7f (a value)
, tu puntero de pila ya estaría apuntando a estos datos cuando se ejecuta la instrucción pop
, almacenando esta palabra dentro de tu registro eax.
Luego, ret
para seguir inmediatamente resalta la siguiente dirección del gadget ROP para continuar en ejecución.