Antes de nada gracias .:UND3R:. por contestar,
Respecto a la respuesta que me das se que me es de gran ayuda, es por eso que quería decirte unas cosillas:
1. Por que sabes que la shellcode esta en ESP en el momento de sobrescribir el EIP? (puede dar el caso de que este o has de hacer un relleno de X bytes para que verdaderamente apunte a la dirección del inicio del ESP no?)
2. Con que te refieres con la dirección del stack? te refieres a la de la cima?
3. A que te refieres con hardcodear una dirección? no entiendo esa jerga(pd: he intentado buscar esa definición y no me a quedado muy clara).
Por que se busca con findjmp.exe una dirección de una dll que haga uso el programa vulnerable y con esa dirección sobrescribir EIP para que así que apunte al inicio del ESP?. Esa dirección aunque a priori es fija(en el S.O que uso y lo sera en sistemas operativos iguales al utilizado) pienso que también cambiara cuando se cambie de S.O o no?
1) ESP siempre apunta al inicio de la pila.
2) Con la dirección del stack me refiero al rango de direcciones destinadas a usarse como pila.
3) hardcodear claro es una jerga y se refiera a usar una dirección estática y esto en el mayor de los casos posibles debe ser evitado.
Ahora con el pto 3 puedo intentar guiarte porqué es mejor JMP ESP que modificar el EIP con una dirección del stack.
Las direcciones del stack varían de acuerdo a múltiples factores, por lo cual esa address no será igual aun teniendo el mismo SO (el idioma, versión, actualización, hace que las direcciones varíen) No es lo mismo Windows XP SP1 ESP sin actualizar que Windows XP SP1 ESP con una actualización, y mucho más distinto si cambian los idiomas, los service pack entre otros factores. Pero si por ejemplo la dirección de una instrucción (JMP ESP en este caso) será la misma en cualquier versión (si obviamos ASLR).
Espero que se hayan aclarado tus dudas, saludos.