BULMA Bulma amb el projecta Defective by Desing
Bergantells Usuaris de GNU/Linux de Mallorca i Afegitons   |   Bisoños Usuarios de GNU/Linux de Mallorca y Alrededores
CONTENIDOS
. Jornadas de software libre
. Version para PDA
. Enlaces breves
. La asociacion
. Los mas leidos
. Autores [Actividad]
. Ultimos Comentarios
. Todos los titulares!
. Estadisticas
. Guia de estilo
. ¿Sugerencias?
. Wiki
. XML [Ayuda]
Listas de correo
. Archivos bulmailing
. Archivos BulmaGes
Radio libre :-)
. Des de la Xarxa (Archivos)
. Mallorca en Xarxa
Busquedas

+ Enlaces Linux
Ultimos kernels
(01/08/2010 05:10:59)
    
Google


En bulma.net
En internet
Fundamentos de los Buffer Overflow's (26713 lectures)
Por Eduard Llull
Daneel ()
Creado el 08/06/2001 18:32 modificado el 08/06/2001 18:32

Seguro que muchos de vosotros habeis oido hablar de los desbordamientos de buffer o buffer overflow, fuente de muchos exploits, pero no sabeis como funcionan. En este artículo explicaré sus fundamentos, aunque no os penseis que os voy a dar la receta para hackear a nadie 8-).

Pagina1/1

Empezaremos recalcando que el lenguaje C no comprueba en tiempo de ejecución los limites de los arrays. Para demostrarlo utilizaremos un sencillo ejemplo:

 
  // File: ej1.c 
  #include  
  #include  
 
  int main(int argc, char *argv[]) { 
    char arr1[5] = "AAAA\0"; 
    char arr2[5]; 
 
    puts(arr1); 
    strcpy(arr2, "BBBBBBBBBBBB"); 
    puts(arr1); 
 
    exit(0); 
  } 

Si ejecutamos este simple programa veremos que en el segundo puts(arr1), la salida es 'BBBB'. En el strcpy, el string origen es más largo que el destino (arr2) por lo que ha empezado a sobreescribir posiciones de memoria (arr1).


Otro concepto que debemos aclarar, antes de meternos de lleno en la explicación de los desbordamientos de buffer, es el funcionamiento de la pila. Para los que no lo sepan, una pila es una cola FILO (First In, Last Out). Utilizando el simil que usaron cuando me lo explicaron a mí, podemos pensar en la pila como un montón de platos: cuando queremos poner un plato al montón lo ponemos encima, y para quitar el que está debajo debemos quirtar primero los de encima. Pues justamente así funciona la pila, lo primero que se introduce en la pila, es lo último que sale. Para introducir datos en la pila contamos con la instrucción push, mientras que para sacarlos tenemos pop
Para saber en que posición de memoria se encuentrá lo más alto de la pila, la arquitectura ix86 cuenta con el registro %esp (Stack Pointer). Remarcaremos que en esta arquitectura la pila crece hacia las posiciones de memória más bajas, es decir, cuanto más cosas metamos en la pila, más baja será la dirección de la memoria en que lo escribamos.Cada una de las posiciones de la pila es una longword (4 bytes).


Muy bien, ahora veamos que ocurre en nuestra CPU cuando llamamos a una función. Para entender esta parte serán necesarios tener ciertas nociones del funcionamiento interno de los microprocesadores. Utilizaremos un simple programa y el debugger gdb:

 
  // File: ej2.c 
  #include  
  #include  
 
  void funcion(char *p) { 
    char arr[16]; 
    strcpy(arr, p); 
    return; 
  } 
 
  int main(int argc, char *argv[]) { 
    funcion(argv[1]); 
  } 

A continuación ejecuteremos:
 
  $ cc ej2.c -o ej2 
  $ gdb ej2 
  (gdb) disassemble main 
  Dump of assembler code for function main: 
  0x80483ec <main>:       push   %ebp 
  0x80483ed <main+1>:     mov    %esp,%ebp 
  0x80483ef <main+3>:     mov    0xc(%ebp),%eax 
  0x80483f2 <main+6>:     add    $0x4,%eax 
  0x80483f5 <main+9>:     mov    (%eax),%edx 
 
  0x80483f7 <main+11>:    push   %edx 
  0x80483f8 <main+12>:    call   0x80483d0  
  0x80483fd <main+17>:    add    $0x4,%esp 
 
  0x8048400 <main+20>:    leave 
  0x8048401 <main+21>:    ret 
  0x8048402 <main+22>:    nop 
  ... 
  End of assembler dump. 

En rojo tenemos remarcado lo que nos interesa: metemos el parámetro de la función en la pila, llamamos a la función y cuando regresamos, recuperamos el espacio de la pila utilizado por el parametro. Pero ¿cómo sabe la función a que dirección debe volver cuando acabe? Para resolver este problema, la propia instrución call introduce en la pila la dirección de retorno. Entonces, en el momento en que llamamos a la función tendríamos la pila como:



Veamos ahora que hace la función:
 
  (gdb) disassemble funcion 
  Dump of assembler code for function funcion: 
 
  0x80483d0 <funcion>:    push   %ebp 
  0x80483d1 <funcion+1>:  mov    %esp,%ebp 
  0x80483d3 <funcion+3>:  sub    $0x10,%esp 
 
  0x80483d6 <funcion+6>:  mov    0x8(%ebp),%eax 
  0x80483d9 <funcion+9>:  push   %eax 
  0x80483da <funcion+10>: lea    0xfffffff0(%ebp),%eax 
  0x80483dd <funcion+13>: push   %eax 
  0x80483de <funcion+14>: call   0x8048308  
  0x80483e3 <funcion+19>: add    $0x8,%esp 
  0x80483e6 <funcion+22>: jmp    0x80483e8  
  0x80483e8 <funcion+24>: leave 
  0x80483e9 <funcion+25>: ret 
  0x80483ea <funcion+26>: mov    %esi,%esi 
  End of assembler dump.    

Lo primero que hace es guardar el registro %ebp en la pila y después copia el valor de %esp a %ebp. El registro %ebp se utiliza para poder referenciar de forma sencilla a los parámetros que fueron pasados a la función. Después, restamos 16(0x10) bytes al puntero de la pila. Recordad que la pila crece hacia la posición de memoria 0. Con esta resta hemos reservado memoria para las variables locales de la función. En este momento el estado de la pila será:


Los desbordamientos de buffer se basan en introducir código máquina en el espacio reservado para las variables locales y después modificar la dirección de retorno para que apunte a la posición de memoria donde hemos introducido nuestro código. Este código puede ser lo que se conoce como un shell code, es decir, las instrucciones necesarias para lanzar un interprete de comandos como puedan ser el bash, sh, etc.
Lo que se suele hacer es aprovechar la función strcpy para sobreescribir posiciones de memoria. El string origen de la función strcpy contiene nuestro código máquina al principio y después la nueva dirección de retorno repetida tantas veces como sea necesaria para llegar a sobreescribir la antigua. De esta manera, cuando la función llegue a su fin y llame a la instrucción ret, que recupera la dirección de retorno de la pila, la ejecución del programa continuará en la posición de memória que nosotros le hemos indicado y en la que tenemos nuestro código.


Bueno, espero que este artículo hos haya ayudado a comprender como funcionan los archiconocidos y temidos buffer overflows. Para acabar diré que hay parches para el kernel de Linux que evitan que se pueda ejecutar código máquina que resida en la pila. De esta manera se imposibilitan este tipo de ataques.

Imprimir
Version para
imprimir

Imprimir
Version
PDF
Comentarios
Es posible que se hayan omitido algunos comentarios considerados poco constructivos
1.  Re:Fundamentos de los Buffer Overflow's (08/06/2001 23:36, #1548)
  Por: Zebub
Para más información nada como el 'Smashing the stack for fun and profit' de Aleph1.

 
2.  Re:Fundamentos de los Buffer Overflow's (08/06/2001 23:37, #1549)
  Por: Zebub
Oye! No tendrá nada que ver el artículo ese de Aleph1 con tu página web? :^mmm

 
3.  Re:Fundamentos de los Buffer Overflow's (08/06/2001 23:53, #1550)
  Por: Daneel (http://aleph.imagoediciones.com)
Pues no X'-D
Mi página web, es una revista de literatura (Cómis y libros). No tratamos nada de informática.

 
4.  Re:Fundamentos de los Buffer Overflow's (09/06/2001 00:29, #1551)
  Por: El cobarde anonimo
Ah! Entonces tendrá que ver con la novela de Borges... :)

 
5.  Re:Fundamentos de los Buffer Overflow's (09/06/2001 23:21, #1559)
  Por: gallir (http://m3d.uib.es/~gallir/)
Muy bueno el artículo, de lo mejor que he visto explicando el buffer overflow y el tema de la pila.

--ricardo

 
6.  Re: Fundamentos de los Buffer Overflow's (09/03/2002 23:29, #5141)
  Por: H008
Creo que falto mas, eso esta bien fundamentado y explicado como se produce, pero falto detallar algunas cosas que son importantes.

 
7.  Re: Fundamentos de los Buffer Overflow's (03/02/2003 03:29, #11957)
  Por: Des (Argentina)
Me parecio bueno el articulo, muy bien ecplicado. Eso sí.. me quedé con ganas de más. ;-D
Supongo que buscaré ese articulo de Aleph1.

 
8.  Re: Fundamentos de los Buffer Overflow's (30/07/2003 14:59, #16158)
  Por: Ragnarok
Lo que yo hecho de menos es una explicación o un link para los novatos para que puedan aprender que es el registro %ebp, %esp y demás.

 
9.  Re: Fundamentos de los Buffer Overflow's (16/10/2003 04:57, #17498)
  Por: StarSur
hay una traduccion al español de "smash the stack for fun and profit (by aleph1)" en http://gul.uc3m.es/listasweb/gul/2000-October/057349.html say no more.

 
10.  Re: Fundamentos de los Buffer Overflow's (22/05/2004 01:39, #21382)
  Por: Anònim
demasiados rodeos para explicar el buffer overflow

 
11.  Re: Fundamentos de los Buffer Overflow's (21/08/2004 21:12, #22925)
  Por: Jesus
Una buena explicacion sobre el buffer overflow pero da muchos r0deos.

 
12.  Re: Fundamentos de los Buffer Overflow's (25/08/2004 23:15, #22993)
  Por: Naye
la pagina esta bien solo que le ase falta que tenga el circuito del buffer y que no solo tenga 1 sino mas, hay tantos tipos de buffer. gracias

 
13.  tipos de buffer, (26/08/2004 18:43, #23016)
  Por: luz
que es el buffer, donde se encuentra, que funcion tiene,y tipod de buffer

 
14.  Re: tipos de buffer, (20/05/2005 02:00, #26716)
  Por: Anònim
No esplica claramente lo que es el buffer y sus funciones

 
15.  Re: Fundamentos de los Buffer Overflow's (19/08/2005 16:54, #27938)
  Por: show
"Para los que no lo sepan, una pila es una cola FILO (First In, Last Out)" Navegando por bulma me he encontrado este articulo, echandole un ojo leo esto!. Por dios, que es esto ? Una pila es una cola ? vale que sean 2 eedd's de uso e implementacion parecidas, pero.. es que una moto no es un coche de 2 ruedas. FILO ? desde cuando ? LIFO en tal caso.... PD: sin animo de tocar los 00s al autor, que seguro que entiende todo lo que he dicho saludos, show ;)

 
16.  Re: Fundamentos de los Buffer Overflow's (17/12/2005 12:58, #30076)
  Por: statefull
Vamos a ver FILO y LIFO .... First In Last Out y Last In First Out, es lo mismo Primero en entrar último en salir = último en entrar primero en salir. Ya que si no te has dado cuenta, si sale primero el último que entró, saldrá el último el primero que entró. Si tenemos la secuencia, a,b,c --> abc. a es la primera en entrar luego es la última en salir, que es lo mismo que decir que c es la última en entrar y la primera en salir. Luego tu comentario no tiene sentido y ahí te has colado ;). Un saludo.

 
17.  Re: Fundamentos de los Buffer Overflow's (10/02/2006 14:21, #30934)
  Por: PAVEL
JAJAJA---ESTO ES MUY CIERTO, FILO = LIFO, , LO QUE PASA ES QUE ESTAS SIGLAS HAN IDO DESGENERANDOSE EN EL TIEMPO.- NO EXISTE EL FILO , SINO EL FIFO Y EL LIFO.- ESTAS SIGLAS TENIAN QUE VER CON LAS MERCADERIAS EN UNA BODEGA, EN EL AREA CONTABLE FUE INVENTADAS POR EL PADRE DE LA CONTABILIDAD HACE VARIOS SIGLOS .- EN TODO CASO , YA NOS ESTAMOS ALEJANDO DEL BUFFER--JJAJAJA SLU2 PAVEL - CHILE

 
18.  Re: Fundamentos de los Buffer Overflow's (19/03/2006 03:01, #31512)
  Por: Antonio
Ën todo caso en contabilidad LIFO y FIFO tienen un significado harto distinto: es un método de valoración de inventarios, de mercancías. En el método FIFO, las mercancías al expenderse son valorizadas al precio que tenían las que primero fueron adquiridas ( las que entran primero salen primero). En el método LIFO, es al revés: las mercancías que salen se valorizan al precio de las que ingresaron al final. El monje sólo inventó la contabilidad por partida doble, pues la contabilidad ya la conocían los romanos al detalle, para administrar su patrimonio y seguramente, la inventaron los fenicios que eran bala para el comercio y antes de ellos los sumerios, vaya a saber uno. Pero, qué hay que hacer para superar el overflow ?????????????????????????? Tengo un progama que cuando lo trato de instalar me sale esa lectura : OVERFLOW

 
19.  Re: Fundamentos de los Buffer Overflow's (26/10/2005 01:25, #29094)
  Por: sesinator
Charmander Pichachu Vovazaur, Charmilion Raichu, Geglipop, Squartl.POkemon wqawwwawwwaw

 
GRACIAS
Distribuciones Universal
Por el servidor
Dpto. de Matematicas e Informatica
Calificacion
***0
Vots: 29
Danos tu opinion:
**** Excelente
***0 Muy Bueno
**00 Bueno
*000 Regular
0000 Malo
Relacionados
. Introducción a GNU Debugger (GDB)
. Baixat el capitul sobre Unix del llibre Hacking Exposed : Network Security Secrets and Solutions
. Testear la seguridad del sistema
. Immunix: buffer overflow mas dificil :-?
. Haz tu kernel más seguro
SECCIONES
Noticia
Breve
Truco
Enlace
Participa
Proyecto
Articulo
Webbulma
Manoletada :-)
Seguridad
Modificado: 7/6/2010 21:12:54 | Tiempo Total: 0.044 segs | Kernel: Linux - i686 - 2.6.26-1-686 | Last boot: 27/12/2009 22:08 CET
Powered by Apache    MySQL    PHP    Gimp