Sé que en un desbordamiento, la pila se sobrescribe parcialmente, pero no entiendo por qué los registros como EIP o RIP se modifican en este proceso.
¿Por qué algunos registros son modificados por tal ataque?
Los desbordamientos de búfer no modifican directamente los registros; más bien, se usan para sobrescribir la dirección de retorno de la función (el primer elemento en el marco de la pila de la función, 4(%ebp)
en x86) y colocar un código personalizado en la pila que se ejecutará cuando la dirección de retorno sobrescrita se cargue en EIP / RIP.
En las máquinas x86, las operaciones realizadas por call
y ret
son de particular interés:
call
:
Al ejecutar una llamada cercana, el procesador inserta el valor del registro EIP (que contiene el desplazamiento de la instrucción que sigue a la instrucción CALL) en la pila ( para su uso posterior como puntero de instrucción de retorno ). El procesador luego se bifurca a la dirección en el segmento de código actual especificado con el operando de destino.
ret
:
Transfiere el control del programa a una dirección de retorno ubicada en la parte superior de la pila . La dirección generalmente se coloca en la pila mediante una instrucción CALL, y el retorno se realiza a la instrucción que sigue a la instrucción CALL.
El control de EIP / RIP se realiza al sobrescribir la dirección de retorno call
insertada en la pila de tiempo de ejecución con una dirección que apunta a la ubicación en la memoria del código creado por el atacante. Cuando la instrucción ret
escribe esta dirección de memoria en EIP / RIP, la ejecución salta a esa dirección.
Puedes ver esto por ti mismo siguiendo las instrucciones del programa usando un depurador.
Lea otras preguntas en las etiquetas buffer-overflow stack-overflow