Para que se produzca un desbordamiento del montón y se ejecute un código arbitrario, la función free()
realiza el paso:
hdr->next->next->prev = hdr->next->prev
Entiendo que la dirección de hdr->next->next->prev
se calcula como hdr->next->next + 4
. Bastante claro.
Ahora, este valor será sobrescrito por la dirección hdr- > next- > prev que está controlada por el atacante y que contiene el código de shell posiblemente en el mismo montón (asumiendo que es ejecutable)
La dirección de destino, es decir, el valor en hdr->next->next
en un desbordamiento de pila de vainilla debe ser la dirección en la pila que almacena la dirección de retorno después de que free()
haya completado su trabajo.
Q1. ¿Cómo determina un atacante la dirección Exacta del puntero de retorno de free()
en la pila?
Q2. La razón principal por la que ocurre esto es porque el puntero agrega 4 al valor hdr->next->next
para escribir el puntero prev
. ¿Se ha solucionado esto o sigue siendo uno de los motivos de los desbordamientos actuales del montón? (La razón por la que pregunto esto es que estoy al tanto de otras explotaciones de pilas, como el doble gratuito, etc., solo quiero asegurarme de que la razón primitiva haya sido corregida)