Eso sería mucho más difícil porque necesitarías usar un desplazamiento cada vez. Existen varias soluciones, dependiendo de la técnica que se utilice:
Si se usa ASLR , no está seguro de dónde se encuentra su código de shell, pero aún puede omitir esto rociando. También solo la dirección base es aleatoria, no la función desplazada, y puede regresar a plt .
nX / DEP también tiene sus defectos, por ejemplo, Java solicita memoria por PAGE_EXECUTE_READWRITE y, por lo tanto, la hace ejecutable.
Pero en general, para que la mayoría de las vulnerabilidades conocidas funcionen, la dirección debe ser absoluta. En un desbordamiento de búfer tradicional en la pila, el código de shell es parte de los datos que desencadenan el desbordamiento, por lo que está en el búfer. La dirección de retorno es absoluta, por lo que no es suficiente que el atacante conozca el código de la función atacada; el atacante también debe saber cuál es la profundidad de la pila en ese momento, y esto depende del comportamiento de la aplicación anterior. Sin la profundidad de la pila, no tendrías ni idea de qué tan grande es el desplazamiento.