Hasta hace un par de años cuando se compilaba un programa se establecía en que direcciones de memoria quedaba mapeado para futuras ejecuciones. Esto tiene el problema que si el programa es propenso a algún fallo de seguridad como desbordamiento de buffer o format string, si las variables de la pila no cambian en tamaño las direcciones usadas siempre serán las mismas y se puede programar un exploit con total acierto.

Para dificultar esto el kernel Linux introdujo en la versión 2.6.11 la aleatorización de direcciones (VA space randomization), tanto cuándo se mapean librerías en memoria o cuando se carga un programa, por tanto varían también las posiciones de la pila o las de código (section .text). Esto añade un rango de 8 MB para la carga del programa y librerías por lo que hace imposible acertar la dirección donde está el código. En Windows hasta la versión XP no se introdujo ninguna mejora. En XP se usa una cookie para detectar posibles desbordamientos en la pila cada vez que se llama a una función y se apila el EIP.

Finalmente en Windows Vista Beta 2 se introdujo ASLR (Address Space Layout Randomization) que se encarga de mapear un programa o librería en un rango de 256 posiciones [1].

[1]http://blogs.msdn.com/b/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx