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
.debugContiene información para ayudar a la depuración..ctorsContiene punteros a constructores de C++..dtorsContiene punteros a destructores de C++..dynamicContiene información relevante para el enlazado dinámico..dynsymContiene la tabla de símbolos para el enlazado dinámico..finiContiene código de finalización del programa..initContiene código de inicialización del programa..shstrtabContiene una tabla de strings con los nombres de las secciones..strtabContiene una tabla de strings normalmente usada para nombrar los elementos de la tabla de símbolos.
Más documentación
- The 101 of ELF files on Linux: Understanding and Analysis - Linux… https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/
- What is PLT/GOT? (https://reverseengineering.stackexchange.com/questions/1992/what-is-plt-got)
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
- PE Format - Win32 apps (https://docs.microsoft.com/en-us/windows/win32/debug/pe-format) https://upload.wikimedia.org/wikipedia/commons/1/1b/Portable_Executable_32bit_Structurein_SVGfixed.svg
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 handleGetProcAddress: 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.
- En Windows usará:
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
- ssdeep
- Imphash
- TLSH (https://tlsh.org/)
- Authentihash (https://developers.virustotal.com/reference/authentihash)
- Hashing de recursos
- Iconos, estáticos, etc.
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!)
- UPX: the Ultimate Packer for eXecutables — https://upx.github.io/
- PEiD — https://www.aldeid.com/wiki/PEiD
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 softwareUser32.dll: Interfaz (GUI) y objetos del espacio de usuarioWininet.dll: Conexiones de redgdi32.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…
- https://docs.microsoft.com/es-es/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
- https://docs.microsoft.com/es-es/dotnet/standard/design-guidelines/general-naming-conventions
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ón | CreateFileW | WriteFile | ShellExecuteW | HttpSendRequest |
|---|---|---|---|---|
| DLL | Kernel32.dll | Kernel32.dll | Shell32.dll | WinInet.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!