Bueno, estoy haciendo un programa con sockets y estoy tratando de usar memcpy, al parecer creo ya estoy comprendiendo más la utilidad, pero se me ocurrio tratar de ver si hay un bug, coloque las clásicas A's, ya que he visto retos de como explotar errores usando memcpy y efectivamente, me aparecio el fallo de segmento.
Obviamente hice la exploración con un debugger y adivinen.
Código:
0x7fffffffdb2c: 0x00000002 0x00000000 0x0000e800 0x00000000
0x7fffffffdb3c: 0x00000000 0x03000105 0x000000e8 0x00000000
0x7fffffffdb4c: 0x00000000 0x41414141 0x41414141 0x41414141
0x7fffffffdb5c: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb6c: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb7c: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb8c: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb9c: 0x41414141 0x41414141 0x41414141 0x41414141
Y ok, ya encontré un error en mi programa y seguro con un poco de imaginación consiguiría un "SIGTRAP". Pero lo que me interesa saber es como evitar ese problema.
¿Qué me aconsejan para evitar ese bug?, ¿utilizar memcpy_s?, ¿nunca usar argv en un memcpy?, pero entonces donde coloco el parametro de argv para que no perjudique a memcpy.
Como seguridad ¿como evito ese tipo de bugs y de que otra forma segura lo puedo hacer?.
Saludos.
EDITADO
--------------------------------------------------------------------------------------
Acabo de observar algo, se que esto es para la zona de exploits, sin embargo, me interesa más la programación de seguridad, solo lo coloco como dato extra por si alguien me puede explicar.
Ok, mientras esperaba se me ocurrió hacer el sigtrap, sin embargo, no lo lograba y me recordé que estoy usando un sistema de 64 bits, y los datos mostrados por el debugger son de double word.
Lo modifique a g para verlo en formato de 8 bytes y me di cuenta que lo que yo pensaba que era el jump del ret, pues resulta que no se sobreescribe del todo.
Código:
0x4548530042424242
Llegue a pensar en un GOT a memcpy, pero viendolo así como se los coloco, no sé, aun soy muy ignorante en muchas cosas. ¿Pero creen que sea el método one byte (creo así se le llama)?. Sé que debe ser 1 byte, pero no se si también así funcione.
No lo he intentado, porque aun no lo entiendo del todo el one byte... ¿pero creen que sirva ese método?, o creen que simplemente sea un falso positivo en mi programa, ya que si aumento la sobreescritura, ya no me aparece ningun mensaje de error.
Repito, esto lo pongo como detalle que para mi es interesante, y talvez podría ser util para ayudarme con la duda mejor.
Por cierto, si se preguntan que hice... este es la parte del problema
Código:
char datos = (char)strlen(argv[1]); <-- esto lo reutilizo después.
memcpy(buffersend+6,argv[1], datos)