Análisis estático básico

Sesión 7

Análisis estático

Bibliografía básica: Practical Malware Analysis

Herramientas

Todas las que quieras

  • CFF Explorer
  • PEiD
  • PEview
  • pestudio
  • Resource Hacker

Años de desarrollo de herramientas. Por eso usamos FlareVM

PE v. ELF

El fichero que se ejecute, un ejecutable será…

Formato ELF

Headers and sections

  • .bss: Variables estáticas
  • .text: Programa
  • .data: Datos
  • .plt: Imports
  • .got: Direcciones dinámicas
  • .symtab: Exports (offset a funciones)

En Linux es muy importante glibc

/usr/lib/x86_64-linux-gnu/libc-2.32.so

Estructura de un fichero ELF (Linux)

Otras secciones

  • .debug Contiene información para ayudar a la depuración.
  • .ctors Contiene punteros a constructores de C++.
  • .dtors Contiene punteros a destructores de C++.
  • .dynamic Contiene información relevante para el enlazado dinámico.
  • .dynsym Contiene la tabla de símbolos para el enlazado dinámico.
  • .fini Contiene código de finalización del programa.
  • .init Contiene código de inicialización del programa.
  • .shstrtab Contiene una tabla de strings con los nombres de las secciones.
  • .strtab Contiene una tabla de strings normalmente usada para nombrar los elementos de la tabla de símbolos.

Más documentación

Formato ELF

Análisis de ejecutable

  • ¿Empaquetado?
  • objdump
    • -t | sym
    • -T | dyn sym
    • -d | disassm
    • -s | full content

Formato PE

├── DOS Header
├── Field: emagic
└── Field: elfanew
├── DOS Stub
├── NT Headers
├── Field: Signature
├── File Header
├── Field: Machine
├── Field: NumberOfSections
├── Field: TimeDateStamp
├── Field: SizeOfOptionalHeader
└── Field: Characteristics
└── Optional Header
├── Field: AddressOfEntryPoint
├── Field: ImageBase
└── Data Directories
├── Section Headers
└── Sections

Headers and sections

  • .text → Ejecutable
  • .edata → Export tables
  • .idata → Import tables
  • .rdata → Read-only initialized data
  • .data : Initialized data
  • .rsrc → Resource directory

Más documentación

Cabeceras relevantes

Dos Headers

  • emagic

Nt Header.Optional

  • ImageBase: 0x400000
  • AddressOfEntryPoint: relative to ImageBase.
  • BaseOfCode: virtual address of the code section.

Section Headers

  • Virtual Size v. Raw Size

Claridad de análisis

Los ficheros ejecutables pueden contener o no información de depuración

  • Si contienen información de depuración (nombres de funciones, variables,etc,..) son más fáciles de entender cuando estamos analizando.
  • Si no, strippeados

Los ejecutables pueden estar o no optimizados, si están optimizados, a menudo puede ser más complejos de leer.

Los ejecutables pueden estar dinámicamente enlazados (típico) o estáticamente enlazados

Linkado (estático v. dinámico)

  • Estático (autocontenido)
  • Dinámico (con referencias)
    • En Windows usará:
      • LoadLibrary: el sistema cargará la librería especificada (por String nombre) en memoria, y nos otorgará un handle
      • GetProcAddress: para obtener su dirección en memoria y llamar a la función
    • En la próxima sesión veremos para qué sirve esto, y cómo funcionan las llamada entre funciones.

Linkado dinámico

Dynamic linking

  • Import: Funciones que necesita utilizar (puede dar pistas de qué va a hacer)
  • Export: Funciones que tiene codificadas y se pueden usar desde fuera (¿Recordamos todos aquellos .dll?)

.dll

(diagrama exportador/importador; el texto de relleno del PDF aparece con letras duplicadas — se preserva tal cual)

Exportador
dll
v.
exe
VVeessttiibbuulluumm ccoonngguuee
.exe
importador

PE format

Análisis de formato PE

  • CFF Explorer
  • pestudio
  • Dependency Walker

Hashes avanzados

imphash

Tracking Malware with Import Hashing (https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html) — FireEye

Cuando hablamos por primera vez de imphashes, no tenía mucho sentido, pero… ¿A que ahora sí?

Packers (¡SOFTWARE!)

Packing

¿Es un packer?

  • Entroper
  • Bytehist
  • PeID

CFF Explorer (RawSize v. VirtualSize)

Raw = 0, Virtual = x : Sospechoso

Arquitectura Windows

  • Llamaremos “API” a las funciones ofrecidas por el sistema operativo (https://docs.microsoft.com/es-es/windows/apps/desktop/)
  • La API nativa (ntdll.dll), que a su vez usa el kernel de Windows (ntoskrnl.exe), da funciones básicas antes de que se cargue la API de Windows

DLLs comunes

  • Kernel32.dll: Gesión de memoria, procesos, etc.
  • Ole32.dll: Intercomunicación de software
  • User32.dll: Interfaz (GUI) y objetos del espacio de usuario
  • Wininet.dll: Conexiones de red
  • gdi32.dll: Funciones de video

La API de Windows

MSDN: https://docs.microsoft.com/es-es/

A vista de pájaro: https://docs.microsoft.com/es-es/windows/win32/apiindex/api-index-portal

Win32 API

Es la base de todas las demás. Utiliza el modelo de comunicación COM (Component Object Model).

https://docs.microsoft.com/en-us/windows/win32/api/

Como está basada en C, la segregación de entornos está basada en una convención de nombres que ha crecido demasiado…

Convención de nombres

Nombre de funciones

Muy intuitivo

  • Sufijo A|W: Acepta Strings como parámetros
  • Ex suffix: Funciones legacy ← Ya no se usa
FunciónCreateFileWWriteFileShellExecuteWHttpSendRequest
DLLKernel32.dllKernel32.dllShell32.dllWinInet.dll

WinRT API

Debido a los problemas con la convención de nombres, y a la aparición de nuevos entornos (e.g., teléfonos, Xbox, etc.), aparece una nueva API basada en C++ (por tanto, con namespaces): WinRT (Windows Runtime)

https://docs.microsoft.com/en-us/uwp/api/

.NET API

Finalmente, Windows desarrolla un motor de interpretación llamado CLR (similar a la JVM), que permite desarrollar para varios entornos al mismo tiempo: el framework .NET*

https://docs.microsoft.com/en-us/dotnet/api/

*Para nosotros esto es muy bueno: Malware en .NET es malware que podremos decompilar fácilmente

Dependencia entre APIs

(diagrama de capas .NET → Win32 → ntdll.dll; contenido de la tabla mal extraído por el PDF, orden original preservado)

.NET
Win32
ntdll.dll
W1 W2
W3 W4
W1
W2
W3
W4
W1 W2
W3 W4

Ejemplo de cadena de llamadas:

new System.Threading::Thread ()
CreateProcessA ( processthreadsapi.h)
CreateProcess ( kernel32.dll)
NtCreateProcess

pestudio

  • Inteligencia externa
  • Análisis de binario
  • Análisis de ejecutable
  • Muestra conclusiones

Resources

Resource section

  • CFF Explorer
  • Resource hacker

Datos a obtener

  • Recursos que puedan ser relevantes

.NET

REMnux

  • de4dot
  • dotnetfiledump.py
  • ilspycmd

FlareVM

  • ILspy

Macros

olebrowse <FICHERO>
  • Si Macros/VBA/[…]
oledump <FICHERO>
  • o oledump –s # -S <FICHERO>
olevba -c <FICHERO>
  • Extraer código VB

Análisis estático avanzado

En un par de sesiones veremos:

  • Desensamblado: Interpretar código binario como código ensamblador
  • Decompilado: Transformar código máquina a código de alto nivel

Próximamente…

Sesión 8: Análisis dinámico básico — ¡Laboratorio completo!