Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: otroWeyMas.nasm en 16 Abril 2022, 19:46 pm



Título: ¿como evito bugs usando argv y memcpy?
Publicado por: otroWeyMas.nasm en 16 Abril 2022, 19:46 pm
Hola, ¿como estan?.


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)



Título: Re: ¿como evito bugs usando argv y memcpy?
Publicado por: MAFUS en 17 Abril 2022, 02:24 am
Pon un poco más de código y lo que usas en la línea de comandos para llamar al programa.

¿Porque usas char aqui?
Código:
char datos = (char)strlen(argv[1]);

¿Estas tan falto de memoria?


Título: Re: ¿como evito bugs usando argv y memcpy?
Publicado por: otroWeyMas.nasm en 17 Abril 2022, 02:56 am
Jajajaja, lo siento, me diste la respuesta con tu pregunta.

Se me olvido quitarle el char, estaba tan concentrado en tratar de proteger memcpy que no puse atención a eso,ya lo puse como int y ya no me sale el problema.

Solucionado.

Igual, si me pueden dar consejos para proteger memcpy cuando la cantidad de bytes a copiar es variable, se los agradecería, porque eso lo utilicé para una url, como pueden variar, pues decidí utilizar un espacio tan grande memoria. Por eso me preocupaba el overflow, porque facilmente puede entrar cualquier shell.