Que sepas que, llevando 2 años justos sin entrar en el foro, no he podido evitar entrar al ver este post jajajaj. A mí también me comió un poco la cabeza... pero te explico lo mejor que pueda.
Lo que estás buscando con este código es sobreescribir la dirección de retorno de una función que... no tienes. A ver, que me lío. Creo que el problema es cómo lo estás enfocando. Para hacer lo que tú quieres hacer, lo que yo he hecho toda la vida ha sido sobreescribir la dirección de retorno a main () de una función llamada desde main ()... un código como:
#include <stdio.h>
void welldone ()
{ printf ("Campeon!!\n"); return; }
int yo (char *entrada)
{ char buffer
[48]; strcpy (buffer
, entrada
); return 0; }
int main (int argc, char *argv [])
{ yo (argv [1]); return 0; }
Main llama a yo () y le pasa el 1º argumento. Entonces yo () lo copia a un buffer con un tamaño limitado con la función strcpy () (había otra por ahí mejor que strcpy () por este tema, porque te limitaba el tamaño de las cadenas y evitaba estos problemas, pero no recuerdo cómo se llamaba...) y vuelve a main (). Ahí está la clave. Lo primero que yo hacía era sustituir la dirección de retorno a main () por la dirección de welldone (), y luego me las ingeniaba para meter de por medio la shellcode...
Espero que se entienda. Si puedo, subiré un ejemplo en un ratillo... Y el lunes subo el tutorial que dejé a medias (¿¿¿¿con 13 años????) sobre esto. No sé si realmente main () tiene ninguna dirección de retorno que sustituir! Habría que verlo... pero creo que no. Al menos no lo recuerdo así. Voy a por ese ejemplo. A ver si te vale
Sagrini
Lo que te vendría muy muy bien sería echarle un vistazo (estudiártelo ENTERITO, es perfecto) a un libro que se llama "Hacking. Técnicas fundamentales" de Jon Erickson. En cualquier biblioteca estará. Te va a servir muchísimo.
_______________________________________
MODIFICO:
Aquí lo tienes. Es un post antiguo, ya me sonaba a mí de algo el problema.
http://foro.elhacker.net/bugs_y_exploits/first_bof_linux_attack_sagrini_2010_elhackernet_funciona-t317514.0.html;msg1578503#msg1578503En ese link tienes la respuesta completa con el ejemplo para lo de llevar el flujo de la ejecución a una función que no se invoca... y en la página siguiente el ejemplo con shellcode