L'obiettivo qui è di rendere eip
punto al tuo shellcode. Ci sono molti modi per farlo. La prima cosa sarebbe controllare se il tuo shellcode è inserito in un registro. Se ciò accade, puoi eseguire un ret2reg ( return to register ) trovando un gadget che ti consentirà di tornare a quel registro ( come call reg
etc ... ) . Un altro modo sarebbe quello di utilizzare un nopsled - ma non è così stabile. In questo caso il tuo payload potrebbe essere come:
nops + shellcode + (1040 -len(nops+shellcode))*"A" + pack32(a_nop_address)
Tieni presente però che "a_nop_address" dal payload sopra riportato cambia all'interno di gdb
e non sarà stabile nel caso in cui aslr
sia abilitato. Tutti i modi precedenti presuppongono che lo stack sia eseguibile ovviamente. Un altro modo è anche usare una variabile di shell che conterrà il tuo shellcode e quindi renderà eip
punto a quell'indirizzo. Infine, ci sono anche metodi più avanzati, come ret2libc, ret2plt, ROP etc ... , che non usano nemmeno uno shellcode per aprire una shell e possono anche aiutare a bypassare alcune mitigazioni di sicurezza come aslr e pila non eseguibile.