Supongamos una estructura simple:
struct test {
char variable[4];
char variable2;
}
Si escribo algo como variable[4] = '%code%'
hay un desbordamiento de búfer que modifica variable2.
¿ASLR evita este desbordamiento de búfer?
ASLR nunca evita cualquier desbordamiento de búfer. Un desbordamiento de búfer se produce cuando la aplicación escribe más bytes en un búfer de los que pueden caber; poner el búfer en cualquier dirección aleatoria no puede arreglar eso.
Lo que ASLR cambia son las consecuencias del desbordamiento. Un atacante explota un desbordamiento de búfer al tratar de hacer que los bytes adicionales se extiendan sobre otros elementos de forma controlada. ASLR lo hace más difícil de dos maneras:
En el caso de un struct
, ASLR no separará los dos campos de estructura, ya que eso sería contrario a la especificación de C, y rompería el código. Independientemente de ASLR, el campo variable2
siempre estará justo después del búfer variable
en la RAM, por lo que el desbordamiento del búfer se sobrescribirá predeciblemente variable2
. Sin embargo, ASLR aún mueve los fragmentos de código entre dos ejecuciones de la aplicación, por lo que sobrescribir variable2
podría no ser suficiente para, por ejemplo, inyectar código arbitrario.
Lea otras preguntas en las etiquetas buffer-overflow aslr