Ingeniería Inversa.

 

Configuración del ambiente de trabajo.

En esta sección configurará un ambiente seguro de análisis de Malware.
La máquina virtual (VM) que ejecutará el malware no debe contar con acceso a internet ni red de acceso compartido al Sistema Operativo anfitrión. Esta VM está diseñada para ser la Victima, por otro lado, la VM sniffer tendrá un rol pasivo sirviendo y monitorizando el tráfico a internet de la VM víctima. Esta conexión permanece en un ambiente cerrado dentro de virtual box.


Instalando Virtual Box.

Para Windows y OSx siga las instrucciones dentro del binario.


Descargar las máquinas virtuales.

Utilice 7zip para descomprimir los archivos y VirtualBox para los archivos de imágenes.
Éstas VM’s requieren una arquitectura INTEL, AMD no funcionará con éstas imágenes (en futuras entregas, brindaremos soporte para amd).

Descarga de la máquina virtual victima.

  • Verificación MD5: 1cf8e12a6671211e71d2496cdcd08b09
  • Sistema Operativo: Windows 7 Service Pack 1
  • Arquitectura: Intel 32bit
  • Nombre de Usuario: victim
  • Contraseña: re1012017
  • Dirección IP: 192.168.0.2
  • Puerta de enlace: 192.168.0.1

Descarga de la máquina virtual sniffer.

  • Verificación MD5: 2f663ddb8e354e1cf2abb27376b92022
  • Sistema Operativo: Ubuntu 16.04.2 LTS Desktop
  • Arquitectura: Intel 64bit
  • Nombre de usuario: sniffer
  • Contraseña: re1012017
  • Dirección IP: 192.168.0.1
  • Puerta de enlace: 192.168.0.1

Instrucciones Post-Instalación.

Notas: Si continua con inconvenientes al ejecutar la VM, revierta a AnalysisReady snapshot, haga clic derecho en la VM y elija descartar el estado guardado.

1- Instale VirtualBox Cd en ambas VM. Devices -> Insert Guest Additions Cd Image.

  • Si no aparece automáticamente navegue en la unidad de Cd para instalarlo.
  • Siga las instrucciones de instalación desde el dialogo de “Guest Additions”.
  • Nota. Requerirá privilegios de instalación, ingrese la contraeña para cada VM.
  • Apague ambas VM, luego de instalar los ” Guest Additions”.

2- Vm Victima: Dispositivos -> Drag and Drop -> Bidireccional.

3- Vm Victima: Dispositivos -> Shared clipboard -> Bidirectional.

4- Ambas Vm: -> Dispositivos -> Red -> Configuración de red:

  • Seleccionar “atachar/adjuntar a la red interna”.
  • El nombre debe ser espejo en ambas (host) VM. Por defecto es “intnet“.

5- Ejecutar ambas VM para verificar la conectividad.

6- Vm Sniffer: Asegurese que “inetsim” se está ejecutando.

  • Abra una terminal y ejecute: pf -ef | grep inetsim.
  • Si no hay salida, ejecutar: /etc/init.d/inetsim start
  • Ejecute el comando “ps” nuevamente para confirmar si esta corriendo.
  • Salida de los comandos.

Underc0de - salida de comandos

7-Vm Victima: Verificar conexión con la Vm Sniffer.

  • En la barra de búsqueda escribir: cmd.exe (para abrir una termial).
  • Ejecutar el comando: ping 192.168.0.1
  • Salida de comandos.

Underc0de - salida cmd

8- Vm Sniffer: Devices -> Shared Folders -> Shared folder settings.

  • Crear una carpeta compartida de nombre “sniffshare”.
  • En la VM elegir “Agregar nueva carpeta compartida” y navegar a la carpeta creada en el paso anterior.
  • En la VM Sinnfer, abrir una termial y ejecutar: mkdir ~/host; sudo mount -t vboxsf -o uid=$UID,gid=$(id -g) sniffershare ~/host

Anatomía de un programa portable C en Windows.

Los programas típicos de Windows están en el formato (PE) “Portable Executable” que es lo mismo que ejecución portable. Es portable debido que contiene información, recursos y referencias a las DLL (Dynamic-linked libraries) que permite a Windows cargar y ejecutar el código máquina.

Underc0de - estructura C


Arquitectura de Windows.

En éste laboratorio nos enfocaremos en las aplicaciones.

Modo usuario vs Modo Kernel.
  • En el modo usuario, una aplicación inicia un proceso que viene con su propio espacio de memoria virtual y manejo de tablas.
  • En el modo Kernel, la aplicación comparte el espacio de memoria virtual.

El diagrama muestra la relación de los componentes de la aplicación para el modo usuario y kernel.

Underc0de - arquitectura windows


Cabecera de un PE.

El header o cabecera de un PE provee información para el sistema operativo en cómo mapear el archivo en la memoria. El código ejecutable ha designado regiones que requieren una proteccion diferente de memoria (RWX).

  • Lectura.
  • Escritura.
  • Ejecución.

El diagrama muestra como el header es roto.

Underc0de - stack

La imagen siguiente muestra un volcado de un header PE con el que trabajeremos.

Underc0de - headers


Capas de la memoria.

  • Stack: Región de la memoria que es agregada o quitada utilizando el proceso (LIFO) “Last in First out”.
  • Heap: Región para el alojamiento aleatorio de memoria.
  • Program Image: El código ejecutable PE ubicado en la memoria.
  • DLLs: Imagenes cargadas DLL que son referenciadas por el PE.
  • TEB: Bloque de ambiente de hilos, almacena información sobre los hilos actuales que estan en ejecución.
  • PEB: Bloque de ambiente de procesos, almacena información sobre módulos cargados y procesos.

El diagrama ilustra como el PE es ubicado en la memoria.

Underc0de - mapa de memoria

La pila (stack).

  • El dato es puesto (pushed) sobre o quitado de la estructura de datos de la pila.
  • EBP: El puntero base es el registro utilizado para almacenar las referencias en la trama de la pila.

El diagrama representa una trama típica de la pila.

Underc0de - stack frame


Lenguaje ensamblador X86.

La programación en C es un lenguaje de alto nivel interpretado por el compilador que convierte el código en instrucciones máquina llamado lenguaje Ensamblador. Utilizando una herramienta desensamblador puede obtener el lenguaje ensamblado de un programa compilado en C.

Intel 8086 y 8088 fué la primer CPU en tener un conjunto de instrucciones que ahora es común referenciado como X86. La arquitectura Intel de 32-bit (IA-32) también llamado i386 es la versión de 32-bit de un conjunto de instrucciones x86.

La arquitectura x86 es little-endian, los valores multi-byte son escritos desde el bit menos significativo.

Como verlo.

| A0 | A1 | A2 | A3 |

Almacenado como Little-Endian.

| A3 | A2 | A1 | A0 |


Códigos de operación e Instrucciones.

Cada instrucción representa un código de operación (código hexadecimal) que indica a la máquina qué hacer a cottinuación.

Hay tres categorías de instrucciones:

  • Movimiento de datos/acceso
  • Aritmético/Lógica
  • Flujo de control.

Instrucciones comunes:

  • move,lea ( movimiento de datos, acceso de datos).
  • add,sub (aritmético).
  • or, and, xor (operadores lógicos).
  • shr, shl (operadores lógicos).
  • ror, rol (operadores lógicos).
  • jmp, jne, jnz, jnb (flujo de control).
  • push, pop, call, leave, enter, ret (flujo de control).

El siguiente ejemplo, mueve un valor 0xaaaaaaaa dentro de un ecx.

Instrucción Código de operación.
mov ecx,[0xaaaaaaaa]; 8B 0D AA AA AA AA

Registros.

Los siguientes regitstros muestran como se verían en un debugger.

  • EAX -> 00000000
  • EBX -> 00000000
  • ECX -> 62260000
  • EDX -> 0022E0B8
  • EBP -> 0019F6B4
  • ESP -> 0019F688
  • ESI -> FFFFFFFE
  • EDI -> 00000000
  • EIP -> 772E0F3C (ntdll.722E0F3C)

 

  • EFLAGS     00002406
  • ZF 1  — PF 1 — AF 0
  • OF 0 — SF 0 — DF 0
  • CF 0 — TF 0 — IF 1

 

  • Ultimo error 00000000 (Error_Completado)
  • GS 002B          FS 0053
  • ES 001B           DS 002B
  • CS 0023           SS 002B
Registros de uso general.

Registro

Descripción

EAX Registro acumulador
EBX Registro base.
ECX Registro contador.
EDX Registro de datos.
ESI Origen de índice.
EDI Indice destino.
EBP Apuntador base.
ESP Registro de pila
Registros de segmentación.

Registro

Descripción

SS Segmento de la pila, apuntador a la pila.
CS Código de segmentación, apuntador al código.
DS Segmento de datos, apuntador al dato.
ES Segmento extra, apuntador a datos extras.
FS Segmento F, apuntador a datos extras.
GS Segmento G, apuntador a datos extras.
Registros EFLAG.
ID Nombre Descripción
CF Bandera de acarreo Establece el acarreo de la última operación aritmética (agregación) o prestado (sustracción) un bit mas allá del tamaño del registro. Entonces es verificado cuando la operación es seguida con un agregar-con-acarreo o sustracción-con-prestado a trabajar con los valores muy grandes, solo para un registro contenedor.
PF Bandera de paridad Establece si el número de un conjunto de bits en el último byte significativo es múltiplo de 2.
AF Bandera de ajuste Acarrea de un código binario decimal (BDC), operadores aritméticos numéricos.
ZF Bandera Zero Establece si el resultado de una operación es Zero (0).
SF Bandera de signo. Establece si el resultado de una operación es negativo.
TF Bandera de trampa. Establece paso a paso el debugeo.
IF Bandera de interrupción Establece si la interrupción está activa o no.
DF Bandera de dirección. Dirección de transmisión. Si está establecido, la cadena de operación reducirá su puntero mas de lo que incrementa,, lee la memoria desde el fin.
OF Bandera de sobrecarga Establece si la operación aritmética firmada devuelve un valor extenso para el registro que lo contiene.
IOPL I/O nivel del campo de privilegio (2 bits). I/O nivel de privilegio del proceso actual.
NT Bandera de tareas anidadas. Controla el cambio de las interrupciones. Establece si el proceso actual está enlazado al siguiente proceso.
RF Bandera de resumen Respuesta para manejar excepciones.
VM Modo virtual-8086 Establece el modo compatibilidad 8086.
AM Verificación de alineación Establece si la alineación de la verificación de memoria referenciada está realizada.
VIF Bandera de interrupción virtual Imagen virtual o SI.
VIP Bandera de interrupción virtual pendiente. Establece si una interrupción se encuentra pendiente.
ID Bandera de identificación. Soporte para instrucciones CPUID, si puede ser establecido.

Punteros de instrucciones.

El registro EIP contiene las direcciones de la siguiente instrucción a ser ejecutada.

Ejemplo – Hello World.

Underc0de - ejemplo hello world


Llamando a una función.

Argumentos en la pila.

Underc0de - llamado de funcion

Variables locales en la pila.

Underc0de - stack hello


Recuerden estudiar la revisión de malware, conocer las herramientas y estimar el tiempo de analisis.

Posts Relacionados

Comments

comments

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">