Fecha actual Dom May 20, 2018 18:23 pm

Todos los horarios son UTC - 3 horas




Nuevo tema Responder al tema  [ 2 mensajes ] 
Autor Mensaje
NotaPublicado: Jue Feb 07, 2013 22:59 pm 
Desconectado
maestro gulix
maestro gulix
Avatar de Usuario

Registrado: Dom Abr 22, 2007 18:50 pm
Mensajes: 643
Ubicación: /No se
Código:
# Include
# Include <string.h>

int main (void)
{
    int len ​​= 0;
    char str [10] = {0};

    printf ("\ n Introduzca el nombre \ n");

    gets (cadena); / / Se utiliza gets () para causar desbordamiento de búfer

    printf ("\ n len = [% d] \ n", len);

    len = strlen (cadena);
    printf ("\ n len de cadena introducida es: [% d] \ n", len);

    return 0;
}

En el código anterior, he utilizado gets () para aceptar una cadena de usuario. y se ha calculado la longitud de esta cadena y se imprime de nuevo en stdout. La idea aquí es para introducir una cadena cuya longitud es de más de 10 bytes. Desde gets () no comprueba límites de la matriz por lo que tratar de copiar la entrada en el búfer de cadena y este desbordamiento de búfer manera se llevará a cabo.

Esto es lo que sucedió cuando ejecuta el programa:

Código:
$. / Stacksmash

 Introduzca el nombre
 methosapofis

 len = [0]

 len de cadena introducida es: [12]
*** stack smashing detectado ***:. / stacksmash terminado
======= Backtrace: =========
/ Lib/i386-linux-gnu/libc.so.6 (0 __fortify_fail x45) [0xb76e4045]
/ Lib/i386-linux-gnu/libc.so.6 (+0 x103ffa) [0xb76e3ffa]
. / Stacksmash [0x8048548]
/ Lib/i386-linux-gnu/libc.so.6 (0 __libc_start_main xf3) [0xb75f94d3]
. / Stacksmash [0x8048401]
======= Memory mapa: ========
08048000-08049000 r-xp 00000000 08:06 528260 / home / nocode / consultorio / stacksmash
08049000-0804a000 r - p 00000000 08:06 528260 / home / nocode / consultorio / stacksmash
0804a000-0804b000 rw-p 00001000 08:06 528260 / home / nocode / consultorio / stacksmash
0973a000-0975b000 rw-p 00000000 00:00 0 [heap]
b75af000 b75cb000-r-xp 00000000 08:06 787381 / lib/i386-linux-gnu/libgcc_s.so.1
b75cb000 b75cc000-r - p 0001b000 08:06 787381 / lib/i386-linux-gnu/libgcc_s.so.1
b75cc000 b75cd000-rw-p 0001c000 08:06 787381 / lib/i386-linux-gnu/libgcc_s.so.1
b75df000 b75e0000-rw-p 00000000 00:00 0
b75e0000-b7783000 r-xp 00000000 08:06 787152 / lib/i386-linux-gnu/libc-2.15.so
b7783000-b7784000 --- p 001a3000 08:06 787152 / lib/i386-linux-gnu/libc-2.15.so
b7784000-b7786000 r - p 001a3000 08:06 787152 / lib/i386-linux-gnu/libc-2.15.so
b7786000-b7787000 rw-p 001a5000 08:06 787152 / lib/i386-linux-gnu/libc-2.15.so
b7787000-b778a000 rw-p 00000000 00:00 0
b7799000-b779e000 rw-p 00000000 00:00 0
b779e000 b779f000-r-xp 00000000 00:00 0 [vdso]
b779f000 b77bf000-r-xp 00000000 08:06 794147 / lib/i386-linux-gnu/ld-2.15.so
b77bf000 b77c0000-r - p 0001f000 08:06 794147 / lib/i386-linux-gnu/ld-2.15.so
b77c0000 b77c1000-rw-p 00020000 08:06 794147 / lib/i386-linux-gnu/ld-2.15.so
bfaec000 bfb0d000-rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)

Bueno, esto llegó como una sorpresa agradable que el entorno de ejecución de alguna manera era capaz de detectar desbordamiento de búfer que podría ocurrir en este caso. En la salida se puede ver que smashing pila fue detectado. Esto me llevó a explorar la manera de desbordamiento de búfer se ha detectado.

En la búsqueda de la razón, me encontré con una bandera gcc-fstack-protector ". Aquí está la descripción de este indicador (de la página man):

-Fstack-protector

Emitir código adicional para comprobar desbordamientos de búfer, como los ataques aplastamiento de pila. Esto se hace mediante la adición de una variable de guardia a las funciones con los objetos vulnerables. Esto incluye funciones que llaman a la asignación, y funciones con tampones de más de 8 bytes. Los guardias se inicializan cuando una función se escribe y después se comprueba cuando se cierra la función. Si falla una comprobación de guardia, un mensaje de error se imprime y se sale del programa.

NOTA: En Ubuntu 6.10 y versiones posteriores esta opción está activada de forma predeterminada en C, C + +, ObjC, ObjC + +, si ninguna de-fno-stack-protector, nostdlib-ni-ffreestanding se encuentran.




Así que ya ves que gcc tiene esta bandera que emite código adicional para comprobar desbordamientos de búfer. Ahora, la siguiente pregunta que me vino a la mente fue que nunca he incluido este indicador mientras compilación entonces, ¿cómo consiguió esta funcionalidad habilitada. Después leí las dos últimas líneas que señalan que para Ubuntu 6.10 esta función está habilitada por defecto.

Entonces, como un paso siguiente, decidí desactivar esta funcionalidad mediante el uso de la bandera '-fno-stack-protector ", mientras que la compilación e intente ejecutar el mismo caso de uso que estaba haciendo antes.

Aquí está cómo lo hice:

Código:
$ Gcc-Wall-fno-stack-protector-o stacksmash.c stacksmash
$. / Stacksmash

 Introduzca el nombre
methosapofis

 len = [26214]

 len de cadena introducida es: [12]

Vemos, pues, que una vez que el código ha sido compilado con esta bandera y luego con la misma entrada, el entorno de ejecución no fue capaz de detectar desbordamiento de búfer que realmente sucedió y corrompido el valor de la variable 'len'.

espero que a alguien le sirva.

_________________
"El mayor placer de un hombre inteligente es aparentar ser idiota delante de un idiota que quiere aparentar ser inteligente"


Arriba
 Perfil  
 
NotaPublicado: Vie Jul 19, 2013 12:56 pm 
Desconectado
maestro gulix
maestro gulix
Avatar de Usuario

Registrado: Mié Sep 27, 2006 16:03 pm
Mensajes: 2081
Ubicación: /home/danilote
por que no haces un manual para el wiki?

_________________
Lacosox Inc.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 2 mensajes ] 

Todos los horarios son UTC - 3 horas


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron
Powered by phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë