BASES DE LA ORGANIZACION DEL SISTEMA

En cualquier sistema contamos con 3 elementos vitales que interactuan entre si para obtener algún tipo de resultado o procesamiento, estos elementos son: CPU, dispositivos de Entrada y Memoria. Estos 3 elementos se comunican por medio de lo que se conoce como el bus del sistema (system bus) que permite que estos elementos se comuniquen.

BASES DE LA CPU:

La unidad de procesamiento central, cuenta con 3 elementos vitales en su funcionamiento, estos son:
Unidad de control: Recibe y decodifica las instrucciones enviadas por la unidad de ejecución, y también se encarga de recibir y almacenar datos en memoria

Unidad de ejecución: La ejecución actual de instrucciones es efectuada aquí, esta unidad es la encargada de recibir variables y banderas que determinan el comportamiento de un programa en un momento determinado.

Registers: Se trata de localizaciones internas de memoria utilizadas como variables que son posteriormente enviadas a la unidad de ejecución para su uso y/o procesamiento.

Banderas/Flags: Se encarga de controlar y transmitir los eventos que ocurren mientras la ejecución se esta llevando a cabo.
Los registers y las flags son muy importantes para comprender ensamblador y se desglosan en las siguientes categorías:

Registers de propósito general:

Son usados para los cálculos generales de la CPU estos son:
EAX: Accumulator Register – Utilizado para almacenar operadores y resultados de operaciones.
EBX: Base Register – Utilizado para apuntar a los datos almacenados.
ECX: Counter Register – Utilizado para operaciones de ciclos e iteraciones
EDX: Data Register – Utilizado para operaciones de entrada y salida, Apunta a fuentes de entrada y salida.
ESI: Data Pointer Register – Utilizado para operaciones de memoria y diferentes tipos de cálculos necesarios para la CPU, se usa en conjunto con el EDI
EDI: Data Pointer Register – Utilizado para operaciones de memoria y diferentes tipos de cálculos necesarios para la CPU, se usa en conjunto con el ESI
ESP: Stack Pointer Register – Utilizado para las operaciones de pila, este register siempre apunta al elemento top de la pila.
EBP: Stack Data Pointer Register – Utilizado para las operaciones de la pila. Delimita cada función en la stack, también conocido como stack frame.

Tanto los registers EAX, EBX, ECX y EDX pueden tener un tamaño de 32 bits (evidentemente en ordenadores con arquitecturas de 32 bits) estos pueden ser segmentados de la siguiente forma:

EAX: Segmento de los bits desde 0 -32
AX: Segmento de los bits desde 0 – 15
AL (A low): Segmento de los bits desde 0 – 7
AH (A high): Segmento de los bits desde 7 -15

Esta misma segmentación puede ser aplicada a los otros 3 registers anteriormente mencionados, pudiendo de esta forma acceder a información contenida en bloques de 32, 16 y 8 bits. Por ejemplo para el register EBX

EBX: Segmento de los bits desde 0 -32

BX: Segmento de los bits desde 0 – 15

BL: Segmento de los bits desde 0 – 7

BH: Segmento de los bits desde 7 -15

la misma segmentacion para ECX, EDX.

Registers de Segmento:

Son usados por el registers de instrucción de puntero para acceder a determinados segmentos de la CPU.

CS, DS, SS, ES, FS, GS

Registers de Instruccion de Puntero:

Es probablemente el mas importante de todos desde el punto de vista de un pentester o investigador de vulnerabilidades dado que se encarga de apuntar a la instrucción que la CPU ejecutará en un momento determinado, solamente existe uno y este es: EIP

Registers de Control

Estos Registers determinan los cálculos de la CPU en un momento determinado.

son: CR0, CR1, CR2, CR3, CR4

NOTA: Dependiendo de la plataforma, los nombres de los registers puede cambiar, por ejemplo en plataformas de 64 bits, existen los registers RAX, RBX, RCX, RDX, RSI, RDI, RDP, etc.

BASES DE LA MEMORIA

Las bases de la memoria de un sistema siguen el modelo de memoria virtual, en donde se definen algunos tópicos indispensables para su correcto funcionamiento, este modelo asume que, en primer lugar cada proceso se ubica en el mismo espacio de memoria virtual, sin importar la localización física de memoria actual. Cada proceso tiene la perspectiva que se ejecuta completamente aislado y que disfruta de toda la memoria disponible, ya que desde su perspectiva ningún otro proceso existe. Para que esta abstracción funcione, el sistema operativo y la CPU se encargan de trabajar juntos para mantener esta abstracción, su funcionamiento es similar al siguiente:

Memoria de Programa:

0xBFFFFFFF (High value)

STACK
MEMORIA SIN USAR
HEAP
.BSS
.DATA
.TEXT

0x8048000 (Low Value)

.TEXT Es el segmento usado para la ejecución del código del programa del proceso, se le asigna el valor de memoria mas bajo posible. (0x8048000)

.DATA Es el segmento donde se inicializan los datos para ser usados por el segmento de ejecución.

.BSS es el segmento de datos sin inicializar

HEAP es el segmento de memoria dinámica, donde se asigna espacio a los diferentes segmentos, utilizada por la función malloc en programas escritos en lenguaje C.

Posteriormente se encuentra el segmento de memoria sin usar, que es utilizada por los segmentos anteriores y finalmente esta el segmento de Stack.

Stack es el segmento utilizado para almacenar parámetros de funciones y variables locales. Tiene el valor de memoria mas alto posible (0xBFFFFFFF) El crecimiento de la pila de segmentos parte desde aquí.