Estoy aprendiendo sobre implementaciones de DEP , ahora estoy tratando de averiguar cómo el sistema operativo sabe qué parte de memoria es intended to hold data only
?
Estoy aprendiendo sobre implementaciones de DEP , ahora estoy tratando de averiguar cómo el sistema operativo sabe qué parte de memoria es intended to hold data only
?
En un archivo ejecutable, los bytes se organizan en secciones . Los nombres tradicionales son "texto" para una sección que debe contener código, y "datos" para una sección que debe contener datos. También hay "rodata" (datos de solo lectura), "bss" (datos de lectura-escritura inicializados con ceros) ... Por lo tanto, el sistema operativo sabe qué derechos de acceso otorgar a cada página. Los nombres dados aquí son más de la tradición de Unix, pero los mismos conceptos se aplican al mundo de Windows.
Luego, la aplicación asignará más fragmentos de memoria para sus propios usos. De forma predeterminada, el sistema operativo devuelve los bloques de datos (se permite el acceso de lectura y escritura, pero no la ejecución, al menos si DEP está habilitado). La aplicación puede solicitar explícitamente un cambio con VirtualProtect () : los intérpretes de algunos lenguajes de programación con JIT deben hacerlo ya que, por definición, dinámicamente genere un código ejecutable y luego proceda a ejecutarlo de inmediato.
El sistema operativo realiza un seguimiento de los derechos de acceso previstos para cada página, pero no "adivina": obtiene la información del archivo que se va a ejecutar (es parte del formato) o, para la asignación dinámica , la aplicación en sí misma debe proporcionar la información.
Cualquier archivo ejecutable contiene solo dos tipos de instrucciones: los datos y el código. Típicamente, los datos serán las variables inicializadas y no inicializadas dentro de un programa, mientras que el código serán las instrucciones del programa que procesan y manipulan esas variables. Cuando el archivo ejecutable se asigna en la memoria, las secciones de datos se asignan a la pila y al montón, mientras que las instrucciones del programa se asignan a la sección .text del programa.
Si lo piensas bien, no hay forma de que las instrucciones del programa cambien durante la ejecución del programa, por lo tanto, la sección .text siempre se asigna como legible y ejecutable. Además, ningún programa legítimo querrá ejecutar algo desde una sección de datos de un programa porque contiene solo las variables inicializadas y sin inicializar que se apilan y se apilan como no ejecutables (solo legibles y de escritura). Es por eso que cada vez que DEP detecta cualquier instrucción ejecutable de la pila o del montón, el programa termina. Las instrucciones ejecutables solo se permiten desde la sección .text del programa.