¿Por qué se sobrescriben los registros al desbordarse?

1

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?

    
pregunta Ra'Jiska 13.12.2017 - 23:06
fuente

1 respuesta

4

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.

    
respondido por el SYS_V 14.12.2017 - 01:59
fuente

Lea otras preguntas en las etiquetas