La razón por la que coloca el código de shell antes de la dirección de retorno en su vulnerabilidad de desbordamiento de búfer depende de algunos factores:
- El tamaño del búfer
- El flujo de la aplicación
- Cualquier truco más allá de un simple búfer + dirección de retorno como tener que hacer saltos relativos requerirá un poco de delicadeza
Un ejemplo común de un desbordamiento de búfer puede verse así:
"\x41"*1000 + "\xe7\x51\x78\xa2" + "\x90"*16 + "[shellcode]"
Aquí, he desbordado el búfer con 1000 A, he aterrizado en un lugar donde puedo controlar el EIP para que apunte a una ubicación de mi elección, seguido de algunos NOP para darle espacio a mi Shellcode para desempaquetar, y luego, finalmente, el código ejecutable . Esta es una hazaña relativamente sencilla. La dirección de retorno normalmente sería una instrucción JMP ESP, que se encuentra al comienzo de su trineo NOP. El trineo funciona hasta que llega al código de shell, y como la pila crece, sobrescribe el trineo NOP mientras se desempaqueta y se obtiene la ejecución.
Sin embargo, puede ser que a veces no tengas ese tipo de ruta de explotación y tengas que hacer algo diferente:
"\x90"*16 + [shellcode] + "\x90"*400 + [return address] + "\x90"*5
Aquí tenemos que poner nuestro código de shell al principio porque no es posible un simple JMP ESP. En su lugar, tenemos que encontrar otra instrucción que nos permita saltar al principio para obtener la ejecución. Luego tenemos algo de relleno en ambos extremos de la dirección de retorno.
Así que la respuesta, sin más detalles, es "depende". Depende de la situación específica, con qué trabaje en su exploit, la sala que tenga y el comportamiento de la aplicación en cuestión.