El objetivo aquí es hacer que eip
apunte a tu shellcode. Hay muchas maneras de hacer eso. Lo primero sería verificar si su código de shell se coloca en un registro. Si eso sucede, puede realizar un ret2reg ( regresar al registro ) encontrando un gadget que le permita regresar a ese registro ( como call reg
etc ... ) . Otra forma sería usar un nopsled, pero eso no es tan estable. En ese caso, su carga útil podría ser como:
nops + shellcode + (1040 -len(nops+shellcode))*"A" + pack32(a_nop_address)
Sin embargo, tenga en cuenta que la "a_nop_address" de la carga útil anterior cambia dentro de gdb
y no será estable en caso de que aslr
esté habilitado. Todas las formas anteriores suponen que, por supuesto, su pila es ejecutable . Otra forma es también usar una variable de shell que contendrá su código de shell y luego hacer que eip
apunte a esa dirección. Finalmente, también hay métodos más avanzados, como ret2libc, ret2plt, ROP, etc ... , que ni siquiera usan un código de shell para abrir un shell y también pueden ayudar a evitar algunas mitigaciones de seguridad como aslr y pila no ejecutable.