Leyendo el libro Hacking: The Art of Exploitation de Jon Erickson, estoy tratando de aproximar la dirección de una variable de entorno SHELLCODE
para explotar un programa.
Cada vez que corro getenv("SHELLCODE");
para obtener la ubicación, el resultado es completamente diferente.
Extracto de mi caparazón:
> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3
Entiendo que si se modifica el nombre del programa o se agregan nuevas variables de entorno, la posición sería ligeramente diferente, pero ¿por qué la ubicación varía tanto?
getenv
manual dice que devuelve un puntero a una cadena que contiene el valor de la variable. Todo lo demás no está especificado, por lo que su kernel y / o compilador puede pegar el valor donde lo deseen, siempre que esa promesa de puntero se mantenga fiel. Supongo que la respuesta exacta a esto puede ser una gran magia y depender de varios detalles de implementación de mapeo de memoria y la fase de la luna. (No soy lo suficientemente mago como para darte la respuesta exacta.)