☠️REGISTROS BASICOS

Registros Assembly x86

  • EIP : (Punto de Interrupcion) Este registro apunta a la direccion de memoria que se va ejecutar.

  • ESP : (Puntero de Pila) Este apunta a la parte superior de la pila.

  • EBP : (Puntero Base) Nos marca la direccion de la base del Stack.

  • EAX : Es un acomulador que guarda resultados de las funciones.

  • EBX : No tiene un proposito pero generalmente es usado para la data.

  • ECX : Este funciona como un contador en loops, va incrementando o decrementando.

  • EDX : Este puede almacenar datos extras para facilitar calculos.

  • EDI y ESI : Se usan para copiar bloques de codigo siendo esi el origen y edi el destino.

Vemos un ejemplo de los bits en x86 con una direccion:

Esto para EAX, EBX , ECX y EDX

EAX   00 FB 2F 01   32 bits  (1 DWORD)
AX          2F 01   16 bits  (1 WORD)
AH          2F       8 bits  (1 BYTE)
AL             01    8 bits  (1 BYTE)

Nos podemos ayudar de este pdf http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

VIRTUAL ADDRESS

La direccion virual la tenemos al inicio de las lineas de codigo:

IMAGE BASE

Esta la encontramios en el memory map es un cuadro de codigo que es parte del programa:

RELATIVE VIRTUAL ADDRESS

Para sacar esta direccion debemos de restar el Virtual Address con el Image Base:

De igual manera el dar run al programa y situarnos al principio se nos da esta info:

DESPLAZMIENTO (llamadas y saltos directos)

Para saber cual es el desplazamiento. este lo encontramos despies de la Virtual Address :

El desplazamiento se usa para saber a donde va llamar, en el caso de la imagen con el desplazamiento sabemos la direccion a la que se llamara en el call que es igual a E8 .

Ahora para saber cual es la direccion a la que se llamara debemos sumar el Virtual Addres y el Dezplazamiento tomando que es de derecha a izquierda, pero tambien debemos de sumar la cantidad de bytes que contiene, que en este caso son 5, son 4 del desplazamiento y el otro es el E8 que corresponde al call por lo que quedaria asi:

21372 + 3C4 + 5 = 0002173B

Al darle F7 en el call nos dirigue exactamente a esa direccion:

Es lo mismo para el desplazamiento de los saltos (jmp) pero en este caso el jmp se representa por E9 :

En este caso el salto es negativo ya que se hace hacia arriba.

Llamadas y saltos indirectos

En estos casos tenemos los call que sin indirectos a diferencia de los call directos que su offcode era E8 los indirectos sin FF15 :

Este tambien tiene corchetes en la instruccion. Este no cuenta con desplazamiento, si tienen una direccion pero esta es una direccion directa a donde va llamar el programa.

En esa llamada que se hace al darle clik derecho -> follow in dump -> constant .

Esto nos dara la direccion a donde se apunta:

En la imagen podemos ver tanto la direccion como la funcion a la que apunta, tambien podemos terminar de confirmar al hacer click dercho sobre la direccion -> address:

Para los saltos es igual a la llamada, solo que el offcode del jmp es FF25.

Otros registros e instrucciones que vamos a necesitar los vamos a encontrar en el apartado de Assembly x86.

Última actualización