2012-01-23 13 views
5

Realicé dos programas en C que eran copias exactas uno del otro. Los compilé en la plataforma Linux (Ubuntu 10.04) usando el compilador gcc y obtuve dos ejecutables por separado. Luego obtuve el ensamblado El código de ambos ejecutables utilizando objdump y encontró que el código de ensamblado era exactamente el mismo e incluso la dirección de las instrucciones correspondientes en dos archivos de ensamblaje era la misma. El programa debía imprimir la dirección de una variable. Los programas cuando se ejecutan producen direcciones diferentes y además el mismo programa produce una dirección diferente cuando se ejecuta cada vez.¿Por qué la dirección de las líneas de código es la misma en los dos programas pero la dirección de la variable cambia incluso para el mismo programa cada vez que se ejecuta. Creo que la dirección impresa de la variable en la pantalla es una dirección virtual, pero si es virtual, por qué no puede ser igual cada vez. Es la dirección que se muestra en el código de ensamblaje obtenido por objd ump también es virtual?¿Por qué la dirección de la variable cambia entre ejecuciones?

+0

Casi todas las direcciones visibles son virtuales en CPUs modernas + sistemas operativos. Además, la dirección no tiene que ser la misma, porque no existe un requisito para tal en la mayoría de los lenguajes de programación. –

Respuesta

5

Es debido a address space layout randomization.

Para citar Wikipedia:

Dirección diseño del espacio de la aleatorización (ASLR) es un método de seguridad de ordenador que implica disponer aleatoriamente las posiciones de las áreas clave de datos, por lo general incluye la base del ejecutable y la posición de las bibliotecas, montón y apilar, en el espacio de direcciones de un proceso.

Beneficios

Espacio de direcciones aleatorización dificulta algunos tipos de ataques a la seguridad, haciendo que sea más difícil para un atacante predecir direcciones de destino. Por ejemplo, los atacantes que intenten ejecutar ataques de retorno a la libra deben localizar el código que se ejecutará, mientras que otros atacantes que intenten ejecutar Shellcode inyectado en la pila deben encontrar primero la pila. En ambos casos, las direcciones de memoria relacionadas están oscurecidas por los atacantes. Estos valores deben adivinarse, y una suposición errónea no suele ser recuperable debido a la falla de la aplicación.

Por ejemplo, cuando corro en repetidas ocasiones el mismo ejecutable producido a partir del siguiente código C en mi caja de Ubuntu 10.10:

#include <stdio.h> 

int g = 0; 

int main() { 
    int x = 0; 
    printf("%p %p\n", &x, &g); 
} 

La dirección de la variable local (x) no deja de cambiar, pero la dirección de de la variable global (g) se mantiene igual.

+0

¿Puede explicar por qué la dirección de la variable global permanece igual? Cuando cambiamos aleatoriamente las direcciones de las áreas de datos clave. Esto también cambiaría el rango de direcciones de la sección "datos" en la memoria virtual del proceso, que contiene esta variable global. – user3834119

1

Sí, siempre obtendrá un valor cambiado en la variable de Dirección. esto se debe a que, cuando el programa entra en el modo de ejecución, cuando ejecuta las declaraciones de declaración de variables, cada vez que el controlador crea variables en función de las ubicaciones de memoria disponibles. Esta es la única razón por la que cada vez devuelve un valor diferente para la dirección.

Cuestiones relacionadas