Fecha y hora actual: Viernes 20 Sep 2019 20:03
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

PROVOCAR DESBORDAMIENTO DE LA MEMORIA

Responder al Tema

Índice del Foro > C, C#, Visual C++ > PROVOCAR DESBORDAMIENTO DE LA MEMORIA

Autor Mensaje
Junior
Usuario Iniciado


Registrado: 25 May 2009
Mensajes: 14

Mensaje Publicado: Miércoles 17 Jun 2009 18:34

Título del mensaje: PROVOCAR DESBORDAMIENTO DE LA MEMORIA

Responder citando

Hola, porfavor ayudenme a encontrar un Caso de Prueba, que detecte el desbordamiento de buffer en la memoria montón que se puede producir en el sig. programa:

Código:

#include <stdio.h>

void comprobar (char *pas) {
 char *passwd;
 
 passwd = (char *) malloc (sizeof (char) * 8);
 strcpy(passwd, pas);
 passwd = (char *) strlwr(passwd);
 if (strcmp(passwd, "mipas")==0) printf ("Password correcto. ");
 else printf ("Password incorrecto. ");
 return;
}

int main(int argc, char *argv[]) {
 int i;
 
 comprobar (argv[1]);
 printf ("Finaliza. ");
 scanf("%d", &i);
 return 0;
}



He probado con muchos valores y no logro desbordarlo!
Gracias de antemano por tu ayuda.
JuNioR.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Miércoles 17 Jun 2009 22:28

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

Has probado con meter

NombreDelPrograma PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP^infinito

De todas formas es un poco relativo, ya que depende del sistema operativo...

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Junior
Usuario Iniciado


Registrado: 25 May 2009
Mensajes: 14

Mensaje Publicado: Jueves 18 Jun 2009 18:18

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

Realmente lo has probado ó lo has puesto solo por ponerlo al azar pensando que se desbordará???.....Te cuento que ese valor no logra desbordar el programa!!

Justamente es eso lo curioso....deberia desbordarse a partir del 9no byte.....PERO NO LO HACE!!!!.........hagan la prueba con cuantos valores quieran, y si encuentran la respuesta conpartanla con todos nosotros.....

En mi caso yo estoy con el SO UBUNTU, en una arq. x86

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Viernes 19 Jun 2009 02:05

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

Venga prueba ésto:
Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
   char *prueba; // Te garantizo que te da ERROR
   //char *prueba=(char *)malloc(4); // Lo correcto

   prueba[0]='H';
   prueba[1]='o';
   prueba[2]='l';
   prueba[3]='a';

   printf("Prueba contiene= %s",prueba);

   return 0;
}


Forma simple de desbordar la memoria, es posible que el strcpy use algún tipo de arreglo y corrija el tamaño del puntero, no lo se... En algunos sistemas los accesos a memoria no se controlan, y son ignorados, y sólo te das cuenta cuando se quedá "colgao"... algo muy típico de ms-dos (OJO no la consola de Windows), o en programación de bajo nivel, acceso directo al hardware...

El ejemplo éste si da fallo de segmentación, por llo menos en mi Ubuntu 9.04, no se ni que kernel lleva...

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Junior
Usuario Iniciado


Registrado: 25 May 2009
Mensajes: 14

Mensaje Publicado: Viernes 19 Jun 2009 18:24

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

Si, gracias por tu aporte.......pero yo tambien tengo otros progamitas q sí se desbordan.......

El problema es en este caso concreto que si lo probás verás que no sucede nada fuera de lo normal con cualquier valor que le dés......


Intenta desbordarlo introduciendo algun valor que veas que lo hará, y nos comentas si pudiste o no..

Saludos.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Viernes 19 Jun 2009 22:52

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

pienso que la causa de que no se desborde es el strcpy, ya que podría realizar un arreglo al puntero destino y adaptarlo al tamaño de la nueva cadena... por eso te recomendaría que para el desbordamiento recorrieras el puntero "manualmente" y a la vez insertando valores... es la forma más transparente y fiable de comprobarlo... porque no disponemos del funcionamiento interno de esa función, entendes? Risa

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Sábado 20 Jun 2009 19:47

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

Cita:
Mariano Demarchi escribió:
> Programante escribió:
> >Tal vez la cadena no sea lo bastante larga. O estás desbordando otra
> >zona de memoria.
> >Si está reservada en el montón, tendrás al menos una página
> >(habitualmente 4096 bytes)
> >de espacio reservado para el proceso. Después puede que haya más espacio
> >reservado
> >para el programa (por ejemplo variables del entorno) y siga
> >sobreescribiendo alegremente
> >hasta que se acaba la cadena.
> Cuando se hace una llamada a malloc(), la memoria se reserva en el
> heap que es una porcion de memoria libre con este proposito, el
> alojamiento dinamico.
> Yo no se como funciona internamente malloc, esto depende de que
> algoritmo se ha usado lo cual puede cambiar de version en version de
> la libreria, pero hice algunas pruebas y siempre que hice
> (malloc(sizeof(int)*k),
> con k={1..6}, en sucesivas llamadas las posiciones de los bloques
> reservados difieren 32 bytes,
> con k={7..10}, en sucesivas llamadas las posiciones de los bloques
> reservados difieren 48 bytes,
> con k={11..}, en sucesivas llamadas las posiciones de los bloques
> reservados difieren 64 bytes
> hay que tener en cuenta que tengo ints de 4 bytes.
> Por otro lado cuando hago (malloc(sizeof(char)), se reservan cada 32
> bytes tambien.
> Entonces aparentemente malloc siempre reserva un minimo de 32 bytes,
> mas halla de que no se usen, o quizas solo se trata de una simple
> alineacion de palabras.
malloc() suele tener un tamaño mínimo de reserva por cuestiones de
implementación.
A lo que yo me refería era al espacio que le da el sistema.

Le pides un byte a malloc()
-Malloc decide que te va a dar 32
Malloc pide al SO una página de memoria
-El SO da una página de memoria a tu programa
Malloc separa 32 bytes y te los da a ti.

Simplemente escribiendo el array sólo obtendrás un fallo de segmentación
cuando te salgas de la página que te dio el SO.
Tendrás resultados incorrectos si cambias más allá de lo que te asignó
malloc (modificas otras variables reservadas dinámicamente, o la
estructura interna de la
reserva de memoria, que puede dar violaciones de segmento en free() por
ejemplo).

Es incorrecto escribir más de un byte en esa memoria (pues es lo único
que malloc() te garantiza "tuyo").


Resumidamente... a lo mejor introduciendo más de 32 mil caracteres consigues hacer el desborde... escribe tu programa en la línea de comando, un espacio, y luego pon algo pesado encima de cualquier caracter del teclado, sal a dar una vuelta con los colegas o la novia, y cuando vuelvas dentro de un par de horas pulsa ENTER... Fumao

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Junior
Usuario Iniciado


Registrado: 25 May 2009
Mensajes: 14

Mensaje Publicado: Lunes 22 Jun 2009 17:13

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

jajaja....q buena solución.....irme Amigos mientras esto introduce valores!!!

Pero volviendo a lo serio......en la cita que mensionás hay algo muy interesante..........es sobre el "malloc"....yo no sabía que mientra mas valor introducís eso incrementa el espacio de memoria reservado, entonces es por eso que es casi imposible encontrar valor de desbordamiento, por que siempre se aumenta la cantidad de memoria reservada.

Existe alguna forma de demostrar lo que dice la cita?.....ya que si no muestro un valor en concreto de desbordamiento, entonces sería bueno demostrar el por que no desborda. En principio me agrada la cita, pero quisiera demostrarla entonces. No sé, talvez algun comando ó herramienta q muestre en tiempo de ejecución lo mensionado.


...Creo que ya estamos mas cerca de la solución.....

Saludos. Ordenador

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
CoAdmin


Registrado: 20 Mar 2009
Mensajes: 3136
Ubicación: y*width+x

Mensaje Publicado: Lunes 22 Jun 2009 18:43

Título del mensaje: Re: Como desbordar la memoria en este Programa??

Responder citando

No es broma, ya que si no puedes hacerlo de otra forma, y estás empeñado en hacer el desbordamiento con esa aplicación, sólo te queda meter letras por un tubo y tener paciencia... claro que desbordará, pero no sabría exactamente cuando, ya que depende de la memoria que tengas libre, de tu compilador, de tu SO, de si por casualidad solapas algún dato de otra aplicación o del mismo sistema... aunque esas cosas no pasan con los sistemas operativos multitarea - eso en la teoría -

Mariano escribió:
Simplemente escribiendo el array sólo obtendrás un fallo de segmentación
cuando te salgas de la página que te dio el SO.


Por último si tienes tiempo libre, y quieres ver el funcionamiento físico de lo que pasa, para aprender más, te propongo que te busques una versión Hiper-Vieja del Ms-Dos, por ejemplo el primer PC-DOS, para que lo instales en una máquina virtual configurada con 16 kb, arranca el SO, realiza un volcado de la memoria y grábalo en un fichero, ejecuta la aplicación, realiza otro volcado y guárdalo en otro fichero, luego usa un editor hexadecimal y compara en los dos ficheros y busca las diferencias, estúdialo y es posible que saques alguna conclusión... si no, al menos habrás pasado un par de horas entretenidas...

Junior escribió:
...Creo que ya estamos mas cerca de la solución.....


solución?¿? pienso que lo tuyo es obsesión

Herramientas?¿? pues normalmente muchos IDE son capaces de detectar que tu aplicación pueda desbordar, quizás los chicos de "Builder" te podrían ayudar... pero en general casi tdos los depuradores realizan trazas e indican las direcciones de memoria de los punteros y varibles y muestran además el contenido... Pero yo, lo siento mucho me apeo aquí, espero que consigas tu propósito con éxito... suerte Ok

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

[C] Como se libera la memoria en estructura din...

DanielC C, C#, Visual C++ 1 Miércoles 11 Ene 2017 22:32 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Lista simplemente enlazada, liberar memoria [C]

DanielC C, C#, Visual C++ 2 Viernes 26 Jun 2015 21:56 Ver último mensaje
El foro no contiene ningún mensaje nuevo

duda sobre asignación dinámica de memoria

marcela C, C#, Visual C++ 2 Viernes 13 Jun 2014 17:37 Ver último mensaje
El foro no contiene ningún mensaje nuevo

[C] Memoria dinámica.

josevc C, C#, Visual C++ 12 Viernes 16 May 2014 15:07 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Cuánta memoria liberar

Arg0s Programación en general 7 Domingo 20 Oct 2013 19:50 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,