Fundamentos de Arquitectura 1

Nivel Principiante

Empezaremos con conceptos y términos importantes que nos ayudaran a entender los ataques y exploits que después usaremos.

Veremos CPU, instrucciones, registros, lenguaje máquina y ensamblador, memoria y muchas cosas más.

CPU, ISA y Ensamblador

La unidad central de procesamiento (CPU) es la parte encargada de ejecutar el lenguaje máquina de un programa. El lenguaje máquina o código máquina, es el conjunto de instrucciones que el CPU procesa. Cada instrucción es un comando primitivo que ejecuta una operación especifica tal como mover datos, cambiar el flujo de ejecución del programa, desarrollar operaciones aritméticas y lógicas entre otros.

Las instrucciones del CPU son representadas en formato hexadecimal (HEX). Debido a su complejidad es imposible para las personas utilizar en su formato natural, por lo tanto, el lenguaje maquina es traducido en código nemotécnico (un lenguaje mas legible). Esto es llamado lenguaje ensamblador (ASM). Los dos mas populares son NASM (Netwide Assembler) y MASM (Microsoft Macro Assembler). El ensamblador que vamos a usar es NASM.

En este ejemplo vemos las diferencias entre ambos:

Machine language vs Assembler

Cada CPU tiene su propia arquitectura del conjunto de instrucciones (ISA). ISA es lo que un programador (o un compilador) debe entender y usar para escribir un programa correctamente para un CPU especifico. En otras palabras ISA es lo que un programador ve: memoria, registros, instrucciones, entre otros.

Uno de los mas comunes ISA es el conjunto de instrucciones (o arquitectura) X86, originada del Intel 8086. El acronimo X86 identifica procesadores de 32 bits, mientras X64 (conocido como X86_64 o AMD64) identifica las versiones de 64 bits. (En otros posts veremos con mas detalle este tema).

Registros

El numero de bits, 32 o 64, se refiere al ancho de los registros del CPU. Cada CPU tiene un conjunto fijo de registros que son accedidos cuando sean requeridos. Se puede imaginar a los registros como las variables temporales usadas por el CPU para conseguir y almacenar datos.

Aunque la mayoría de los registros son pequeñas porciones de memoria en el CPU y sirven para almacenar datos temporalmente, nos enfocaremos en un grupo especifico de registros: The General Purpose Registers (GPRs).

La siguiente tabla resume los 8 registros de propósito general. Note que la nomenclatura se refiere a la arquitectura X86.

Nomenclatura X86La nomenclatura para el viejo CPU de 8 bits tiene registros de 16 bits dividido en dos partes: un bit bajo, identificado por una L (Low) al final del nombre, y un bit alto, identificado por una H (High) al final del nombre.

La nomenclatura de 16 bits combina la L y la H, y las reemplaza con una X. Mientras que para los registros Stack Pointer, Base Pointer, Source Pointer y Destination únicamente elimina la L.

En los 32 bits, el acronimo del registro utiliza una E al inicio, significa extendido. Mientras que la arquitectura de 64 bits, la E es reemplazada con una R.

Lo siguiente resume las nomenclaturas utilizadas:

Nomenclatura Arquitectura

En adición a los 8 registros de propósito general, existe otro registro que es importante: EIP (nomenclatura X86). Instruction Pointer (EIP) controla la ejecución del programa almacenando un puntero a la dirección de la siguiente instrucción (lenguaje máquina) que sera ejecutada, en otras palabras le indica al CPU en donde es la siguiente instruccion.

En el siguiente post de arquitectura veremos el proceso de memoria, la pila, endianness y NOPs.

Pura Vida!!!

D3N.

 

De que se trata esto?

Muy simple, hablaremos de ingeniería inversa, análisis de malware, lenguajes de programación útiles para hacking, pentesting (redes, aplicaciones web y móviles), certificaciones que valgan la pena (tecnicamente hablando), y muchas otras cosas más que permitan mejorar nuestras habilidades. Además los temas se indicarán si son para principiantes, intermedios o avanzados.

Saludos desde Costa Rica!!

D3N.