ASLR Randomization BSS

5

Aquí hay un código:

#include <stdio.h>
#include <string.h>

char globalbuf[256];

void function(char *argv) {
   char localbuf[256];
   strcpy(localbuf, argv);
   strcpy(globalbuf, localbuf);
   printf("localbuf addr: %p globalbuf addr: %p\n", localbuf, globalbuf);
}

int main(int argc, char **argv) {
   function(argv[1]);
   return 0;
}

Estaba examinando ASLR y cómo funciona. Más información sobre el sistema operativo y el compilador

gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Linux 3.5.0-32-generic #53-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

Entonces, cuando ejecuto este código, veo una dirección localbuf en constante cambio. Lo cual está perfectamente bien, ya que sé que ASLR está habilitado y configurado en modo Completamente aleatorizado . Pero la dirección globalbuf siempre permanece igual. Sé que las variables globales y estáticas sin inicializar forman parte de la sección BSS; y, por lo tanto, asumo que las secciones BSS, Texto y Datos no están siendo aleatorizadas por ASLR.

¿Esto es correcto? Si no me vinculo hacia un documento . Página 2, el último párrafo se refiere a lo que estoy sugiriendo aquí.

Según tengo entendido, cada proceso tiene su propia pila, montón, texto, bss y secciones / áreas de datos, por lo que cada vez que se genera un proceso, se asigna una dirección aleatoria al puntero base y todo lo demás es solo un desplazamiento de eso. Si ese es el caso, ¿qué se está imprimiendo para globalbuf , es el desplazamiento? ¿Cómo puedo encontrar la dirección real de globalbuf ?

    
pregunta fahad 12.06.2013 - 17:26
fuente

1 respuesta

4

La variable globalbuf es una variable estática sin inicializar, por lo que su dirección virtual es no aleatoria.

  

Sé que las variables globales y estáticas sin inicializar forman parte de la sección BSS; y, por lo tanto, asumo que las secciones BSS, Texto y Datos no están siendo aleatorizadas por ASLR.

La sección BSS no es aleatoria porque está marcada como datos no inicializados. Este es un indicador que se establece en el encabezado de la sección en el archivo ejecutable. Los datos en esta sección son static y siempre tendrán la misma dirección cada vez que ejecutas la aplicación. El valor del puntero que no cambia es la dirección virtual de la variable globalbuf .

Las secciones de texto y datos están aleatorizadas (si la aplicación se compila como independiente de la posición con -fPIE ), porque están marcadas como segmento de código (CS) y segmento de datos (DS) respectivamente. Tenga en cuenta que los segmentos de código y datos tienen un significado especial en x86, y sus direcciones base se completan en los registros de segmento CS y DS. Esta es la razón por la que a menudo verá referencias como dword ptr ds:[05012340] y dword ptr cs:[00410000] en el ensamblaje: la primera es una dirección dentro del segmento de datos (DS) y la última es una dirección dentro del segmento de código (CS). Dado que estas son secciones importantes, sus direcciones base son aleatorias (es decir, compensadas por igual a una dirección base).

    
respondido por el Polynomial 12.06.2013 - 17:55
fuente

Lea otras preguntas en las etiquetas