So che in caso di overflow, lo stack viene parzialmente sovrascritto, ma non capisco perché registri come EIP o RIP vengano modificati in questo processo.
Come mai alcuni registri vengono modificati da un simile attacco?
Gli overflow del buffer non modificano direttamente i registri; piuttosto, sono usati per sovrascrivere l'indirizzo di ritorno della funzione (il primo elemento nel frame dello stack della funzione, 4(%ebp)
in x86) e posizionare il codice personalizzato sullo stack che verrà eseguito quando l'indirizzo di ritorno sovrascritto viene caricato in EIP / RIP.
Nelle macchine x86, le operazioni eseguite da call
e ret
sono di particolare interesse:
call
:
When executing a near call, the processor pushes the value of the EIP register (which contains the offset of the instruction following the CALL instruction) onto the stack (for use later as a return-instruction pointer). The processor then branches to the address in the current code segment specified with the target operand.
ret
:
Transfers program control to a return address located on the top of the stack. The address is usually placed on the stack by a CALL instruction, and the return is made to the instruction that follows the CALL instruction.
Il controllo di EIP / RIP si ottiene sovrascrivendo l'indirizzo di ritorno call
inserito nello stack di runtime con un indirizzo che punta alla posizione in memoria del codice creato dall'attaccante. Quando l'istruzione ret
scrive questo indirizzo di memoria su EIP / RIP, l'esecuzione salta a quell'indirizzo.
Puoi vederlo da solo passando le istruzioni del programma usando un debugger.
Leggi altre domande sui tag buffer-overflow stack-overflow