Este codigo me parecio util para averiguar en que segmento de memoria coloca el S.O. las variables de un codigo C segun sean globales, locales, etc. El codigo tambien muestra el valor de cada variable y su direccion de memoria en esa ejecución. Y alguna cosa mas.
El resultado es que las variables definidas como static en el codigo se colocan en la misma posicion de memoria en todas las ejecuciones. Lo mismo para las globales. Tengo en mi sistema /proc/sys/kernel/randomize_va_space = 2
Es decir, en una compilacion estandar con gcc 4.4.3
- Código: Seleccionar todo
root@bt:~# gcc getseg.c -o getseg
ejecutamos y
- Código: Seleccionar todo
root@bt:~# ./getseg
global_initialized_var is at address 0x00601028
static_initialized_var is at address 0x0060102c
static_var is at address 0x00601040
global_var is at address 0x00601044
heap_var is at address 0x01b99010
stack_var is at address 0xe590418c
the function's stack_var is at address 0xe590416c
root@bt:~# ./getseg
global_initialized_var is at address 0x00601028
static_initialized_var is at address 0x0060102c
static_var is at address 0x00601040
global_var is at address 0x00601044
heap_var is at address 0x01b03010
stack_var is at address 0x1962a25c
the function's stack_var is at address 0x1962a23c
root@bt:~#
ASLR no ha aleatorizado las posiciones de memoria de las globales. Las static tambien residen siempre en la misma posicion de memoria.
La version de glibc es la 2.11.1
Enjoy!
- Código: Seleccionar todo
#unknown author
#include <stdio.h>
int global_var;
int global_initialized_var = 5;
void function() { // This is just a demo function
int stack_var; // notice this variable has the same name as the one in main()
printf("the function's stack_var is at address 0x%08x\n", &stack_var);
}
int main() {
int stack_var; // same name as the variable in function()
static int static_initialized_var = 5;
static int static_var;
int *heap_var_ptr;
heap_var_ptr = (int *) malloc(4);
// These variables are in the data segment
printf("global_initialized_var is at address 0x%08x\n", &global_initialized_var);
printf("static_initialized_var is at address 0x%08x\n\n", &static_initialized_var);
// These variables are in the bss segment
printf("static_var is at address 0x%08x\n", &static_var);
printf("global_var is at address 0x%08x\n\n", &global_var);
// This variable is in the heap segment
printf("heap_var is at address 0x%08x\n\n", heap_var_ptr);
// These variables are in the stack segment
printf("stack_var is at address 0x%08x\n", &stack_var);
function();
}



