Curso Ensamblador x86

Parte 0

INTRODUCCION

Porque ?

  • Es una materia de la universidad.

  • Permite crear programas mas optimizados.

  • Permite comprender mejor el funcionamiento de la computadora.

Donde ?

  • Creacion de sistemas operativos.

  • Creacion de herramientas para sistemas embebidos (IoT).

  • Creacion de drivers.

  • Creacion de compiladores.

  • Examinar y/o modificar programas ya creados (reversing). 

 

 

Curso Ensamblador x86

Parte 1

Componentes

 Componentes de una   computadora

  • CPU

    • ALU           

    • Unidad de control

    • Registros

  • Entrada/salida

  • Memoria principal

 

CPU

CISC

RISK

Grupo complejo de instrucciones para computadoras

 

Grupo reducido de instrucciones para computadoras

multiplica a,b 
Cargar a
Cargar b
multiplica a,b
Guardar a

Unidad de control

Registros

Entrada/Salida

  • Bus de control

  • Bus de datos

  • Bus de direcciones

MEMORIA

SRAM

MEMORIA

DRAM

Curso Ensamblador x86

Parte II

Arquitecturas

La forma en que los componentes de una computadora se interconectan entre si.

 

  • Hardvard

  • Von Neuman

  • Hardvard Modificada

Hardvard

Von Neumann

Hardvard Modificada

Hardvard Von Neumann
x86 (CISC) INTEL/AMD
avr (RISC) ATmega328P
(Arduino)
pic (RISC) PIC16F84A
arm (RISC) QUALCOMM
e.t.c.

Ensamblador para procesador x86

Curso Ensamblador x86

Parte III

Registros

Registros

Diferentes tipos, segun los propositos para los que se utilicen.

 

  • Registros de proposito general
  • Registro de banderas
  • Registros de segmentos

Registros de proposito general

Son utilizados para almacenar los datos con los que se realizaran las operaciones dentro del programa

Registro de banderas

Este unico registro almacena el estado del procesador. 

Registros de segmentos

Estos registros almacenan las direcciones de memoria donde comienzan y terminan los distintos segmentos o partes en las que el sistema operativo la divide.

Registros adicionales

Estos registros permiter realizar calculos en paralelo y de punto flotante. Forman parte del juego de instrucciones extendidas x86.

Curso Ensamblador x86

Parte IV

Ciclo de Fetch

Fases

Segun el autor que consultemos las fases pueden variar, pero por simplicidad diremos que son dos.

  • Fase de busqueda

    • busqueda de la instruccion en la memoria
  • Fase de ejecucion

    • decodificacion de la instruccion
    • ejecucion de la instruccion 
    • almacenamiento de los resultados

Instruccion:
mul ax, 3

Curso Ensamblador x86

Parte V

Modos de direccionamiento

Diferentes formas de determinar la manera de acceder a los involucrados en una operacion.

Ubicar los datos.

Direccionamiento inmediato.

Direccionamiento por registro.

Direccionamiento directo.

Direccionamiento indirecto a registro.

Direccionamiento relativo a la base.

Direccionamiento indexado.

Direccionamiento indexado a la base.

Curso Ensamblador x86

Parte VI

Interrupciones

Debido a que los perifericos y el procesador de una computadora trabajan a un velocidad diferente.

La interconexion de los elementos de una computadora con la CPU se debe de gestionar.

Interrupciones de hardware

Son generadas por señales electricas de los perificos. Existe un elemento de hardware dedicado a procesar las interrupciones generadas por dispositivos como el teclado, ratos, e.t.c. Las clasifica en "puertos" y administra el momentro en el que son atendidas por la CPU. 

Interrupciones de software

Son invocadas desde un programa en esamblador mediante la palabra resevada INT.  Existen dos tipos: las creadas por el sistema operativo y las creadas por el BIOS.

Las interrupciones del sistema operativo son las mas sencillas de utilizar pero a la vez tambien son mas lentas por utilizan las del BIOS.

 

INT 80h  Linux
INT 21h MS-DOS

INT 10h - 33h BIOS

Proceso de ejecucion de las interrupciones

Ensamblador para procesador x86 en Linux

Curso Ensamblador x86

Parte VII

Ensambladores y sintaxis

Ensamblador no solo es el nombre del lenguaje de programacion.

Tambien es el nombre del programa que traduce el codigo escrito en Ensablador a algo llamado codigo objeto

Su principal variacion reside en la estructura del programa y en las palabras reservadas.
 

  • MASM (Microsoft Macro Assembler)

  • TASM (Turbo assembler)

  • GAS (GNU Assembler)

  • NASM (Netwide Assembler)

  • E.T.C

Ensamblador para procesador x86 en Linux con NASM

Existen ademas dos formas de escribir las instrucciones en ensamblador.

 

 

  • Sintaxis AT&T

    • addl $4, %eax

  • Sintaxis Intel

    • add eax, 4

Ensamblador para procesador x86 en Linux con NASM con sintaxis Intel

Curso Ensamblador x86

Parte VIII

Instalacion

  • Ubuntu

    • sudo apt-get install nasm build-essential

  • Arch 

    • sudo pacman -S nasm

  • Fedora y Opensuse

    • se be primero agregar el repositorio al gestor de paquetes para poder instalar

Curso Ensamblador x86

Parte IX

Generacion de codigo maquina

El codigo objeto almacena el codigo maquina de un programa en ensamblador. Los formatos pueden ser coff, elf, obj, win32, e.t.c.

El proceso de enlazamiento combina el codigo maquina con instrucciones y directivas para que sistema operativo sea capaz de interpretar correctamente el archivo ejecuble.

El enlazador por defecto de los sistemas operativos MAC OS X y GNU/Linux es LD

Para crear un ejecutable con NASM en el sistema operativo GNU/LInux  se emplea un par de instrucciones.

 

nasm -f elf archivo.asm

 

se empleara el formato elf por que es el formato mas popular compatible con el kernel Linux.

 

ld -m elf_i386 -o nombre_ejecutable archivo.o

 

porque crearemos ejecutables de 32 bits, a partir de un archivo en formato elf.

Curso Ensamblador x86

Parte X

Hola Mundo

Curso Ensamblador x86

Parte XI

Suma y resta 

Curso Ensamblador x86

Parte XII

Multiplicacion y division 

Curso Ensamblador x86

Parte XIII

Instrucciones de desplazamiento 

Curso Ensamblador x86

Parte XIV

Instrucciones de rotacion

Curso Ensamblador x86

Parte XV

Instrucciones de comparacion

Curso Ensamblador x86

Parte XVI

Saltos

Curso Ensamblador x86

Parte XVII

Instrucciones booleanas I

Curso Ensamblador x86

Parte XVIII

Instrucciones booleanas II

Curso Ensamblador x86

Parte XIX

Estructuras de decision I

Curso Ensamblador x86

Parte XX

Estructuras de decision II

Curso Ensamblador x86

Parte XXI

Estructuras de control I

Curso Ensamblador x86

Parte XXII

Estructuras de control II

Curso Ensamblador x86

Parte XXIII

Macros y procedimientos

Curso Ensamblador x86

Parte XXIV

Arreglos I

Curso Ensamblador x86

Parte XXV

Arreglos II

Curso Ensamblador x86

Parte XXVI

Arreglos III

Curso Ensamblador x86

Parte XXVII

Cadenas I

Curso Ensamblador x86

Parte XXVIII

Cadenas II

Curso Ensamblador x86

Parte XXIX

Cadenas III

Curso Ensamblador x86

Parte XXX

Cadenas IV

Curso Ensamblador x86

Parte XXXI

Archivos I

Curso Ensamblador x86

Parte XXXII

Archivos II

Curso Ensamblador x86

Parte XXXIII

Archivos III

Curso Ensamblador x86

Parte XXXIV

Archivos IV

Curso Ensamblador x86

Parte XXXV

Archivos V

Curso Ensamblador x86

Parte XXXVI

Manejo de la pila

Curso Ensamblador x86

Parte XXXVII

Manejo avanzado de la pantalla

Curso Ensamblador x86

Parte XXXVIII

Debug

Curso Ensamblador x86

Parte XXXIX

Bootloader

Curso Ensamblador x86

Parte XXXX

C y Ensamblador 

Curso Ensamblador x86

Parte XXXXII

Reversing 

#include <stdio.h>

int main(){

   int contrasenia = 1;

   if (contrasenia==2){
    printf("Exito\n");
   }

return 0;
}
~/Desktop $ ./ejemplo
~/Desktop $ sudo r2 -w ejemplo
 -- What about taking a break? Here, have this nice 0xCC.
[0x00000520]> pd32
....
        ,=< 0x0000063d      750c           jne 0x64b
        |   0x0000063f      488d3d9e0000.  lea rdi, qword str.Exito    ; 0x6e4 ; "Exito"
        |   0x00000646      e8c5feffff     call sym.imp.puts
        `-> 0x0000064b      b800000000     mov eax, 0
....
[0x00000520]> 0x0000063d
[0x0000063d]> wx 740c
[0x0000063d]> pd32
        ,=< 0x0000063d      740c           je 0x64b
        |   0x0000063f      488d3d9e0000.  lea rdi, qword str.Exito    ; 0x6e4 ; "Exito"
        |   0x00000646      e8c5feffff     call sym.imp.puts
        `-> 0x0000064b      b800000000     mov eax, 0

~/Desktop $ ./ejemplo
Exito

¡GRACIAS!

Curso ensamblador

By neomatrix

Curso ensamblador

  • 475