Segmentacion de la Memoria – 0×01 - Electronik-Pro, Informatica, Noticas,Wordpress,Facebook,Hacking,Programas,Hosting,Dominios

Bueno hace unos dias tenia ganas de empezar a escribir nuevamente.. asique si dios quiere y tengo paciencia suficiente, voy a tratar de redactar algunos post relacionados al mundo de la explotacion. No sera un curso ni un paso a paso.. simplemente tocare determinados temas y en lo posible tratare de poner ejemplos (la mayoria de estos sera con gdb sobre linux (seria bueno que se relacionen con este)).

En este paper voy a intentar hablar un poco de lo que podemos encontrarnos en el ambiente de un programa compilado (se requiere conocimientos basicos de Assembler y de C), y en el proximo iremos a la parte ‘divertida’ con algunos ejemplos.. cabe aclarar todo esto bajo 32bits, porque despues llegan comentarios como (ya fue la segmentacion en 64! :p).

Segmentacion de la Memoria

Lo primero y fundamental que debemos saber es que la memoria de un programa compilado se va a dividir en 5 ‘Segmentos’ (no reirse de mi obras de arte):

El Segmento de Texto o tambien Segmento de Codigo es donde se encuentran las instrucciones ensambladas. Mientras se va ejecutando el programa el puntero *$EIP apunta a la primera instruccion del segmento de codigo, alli es donde el procesador realiza un loop de ejecucion y donde hace algo parecido a lo siguiente:

  • 1] – Lee la instruccion donde apunta $EIP
  • 2]- Agrega el largo de byte de la instruccion al $EIP
  • 3]- Ahora ejecuta la instruccion
  • 4]- Retorna a [1] para repetir el proceso.

* Apunta a la dirección de memoria de la siguiente instrucción a ejecutar

En este segmento los permisos de escritura estan deshabilitados y no sirve para guardar variables. Esto es algo positivo ya que evita que se pueda modificar realmente el codigo del programa.. si nosotros intentariamos escribir en esta zona el programa se pararia y terminaria.

Otra cosa a tener en cuenta es que el segmento de codigo tiene un tamaño fijo ya que no requiere que algo sea cambiado.

El Segmento de Datos y BSS, en estas zonas es donde se guardan las variables del programa, ya sea las Globales o las Estaticas. En la zona de Datos es donde se almacenan las variables estaticas y las globales inicializadas.. en cambio en BSS es donde se almacenan las variables no inicializadas.

En este caso si se puede escribir en estos segmentos, aunque el tamaño en este caso tambien es fijo.

El Segmento del HEAP, es totalmente controlable por el programador, es decir podra reservar y liberar memoria al momento, algo que diferencia al resto que vimos hasta ahora es que el tamaño no es fijo por lo que puede ampliarse o reducirse segun sea necesario, en este caso la pila crecera o disminuira segun la cantidad de la memoria que sea reservada para su uso. Este crecimiento sera desde abajo hacia arriba en las direcciones de la memoria.

El Segmento de la Pila o Stack, en este segmento podemos encontrarnos con un lugar temporal de memoria utilizado para almacenar aquellas variables de funcion locales y su contexto durante llamadas a funcion. Podemos encontrarnos con que tampoco tiene un tamaño fijo y es logico debido a la cantidad de elementos que se ‘apilan’ y ‘desapilan’ constantemente.

La pila es un area de memoria que esta organizada de manera LIFO (Last In First Out), el sentido de crecimiento de la pila es hacia la zona mas baja de la memoria.. veamos:

En esta zona entran en juego 3 Registros: ESP – EBP – EIP.

ESP se utiliza para seguir la direccion que se encuentra en el final de la PILA. Como vemos en la imagen.

EBP es utilizado como Base para el Frame Stack actual. Tambien conocido como Local Base Pointer, o Frame Pointer.

Cuando entramos a una funcion() el contexto y el puntero $EIP cambiaran, ahi es donde se usa la pila para:

  • Recordar todas aquellas variables pasadas
  • La direccion de retorno, seria la posicion en la que $EIP deberia volver una vez que finalize la funcion. (La instruccion CALL se encarga de eso)
  • Registros guardados
  • Variables locales

Todo esto va destinado a almacernarse en la pila, esto es lo que se conoce como Stack Frame o Marco de Pila.

Bueno de momento queda aca.. muy pronto voy a ver si aplicamos algunos ejemplos para continuar con esto..

0 comentarios:

Publicar un comentario

 
Top