Introduction to Ghidra
Análisis del dropper de WannaCry.
WannaCry Sample
WannaCry fue un ataque global de ransomware que explotaba una falla SMB ( EternalBlue) en septiembre de 2018. El análisis en Ghidra crea parámetros y variables locales para funciones. Nota: esto puede tomar considerable tiempo en archivos grandes.
Encontrar la Función Main ()
En Portable Executables ( PE), main usualmente se llama como WinMain o wWinMain. Para encontrarlo:
- Usar el symbol tree de Ghidra y buscar “entry”
- Chequear las llamadas a función
WannaCry Kill Switch
El URL del kill switch era: http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com Añadir comentarios a direcciones clave en Ghidra usando la opción de comentarios.
Funciones de Internet
- InternetOpenA:** Inicializa el uso de funciones WinINet por una aplicación
- InternetOpenUrlA:** Abre un recurso especificado por una URL FTP o HTTP completa
Lógica del Kill Switch
Si la variable ifVar2 es 0, cierra la conexión y ejecuta FUN_00408090, de lo contrario cierra la conexión y termina el programa. Marcus Hutchins notó el URL, compró el dominio y controló el kill switch. https://twitter.com/MalwareTechBlog
Flow Graph
Ver Window : Function Graph para ver el flow graph de la función.
Análisis de WannaCry
Verificación de Argumentos
Si args < 2, ocurren ciertas acciones.
Creación de Servicio
Renombrar FUN_00407c40 a “createwannacryservice”.
Manejo de Variables Globales
Renombrar variables globales para mayor claridad en la comprensión.
Conversión de Valores
WannaCry intenta encontrar el recurso 1831.
Error en sprintf
A veces, dos argumentos se pushean pero Ghidra no los reconoce automáticamente. Pueden ser:
- staskshche.exe
- s_Windows_00431364 Solución: Override function signature en Ghidra para definir correctamente el tipo.
Data Type Variables
CreateFileA se define como un data type en CreateFileA.
Crear Proceso
La función FUN_00407ce0 crea un proceso tasksexe con el recurso 1831.
Extracción de Recursos
El recurso 1831 puede extraerse usando wrestool:
sudo apt install icoutils
wrestool -x -r 1831 binary.exeWrestool extrae recursos de binarios Microsoft Windows. Ver análisis detallado en: https://www.youtube.com/watch?v=Q90uZS3taG0&abchannel=stacksmashing
Resource 1831
Contiene strings definidos por Windows. El comando para descompilar puede requerir “Clear Code Bytes” con opciones específicas.
Análisis de FUN_00407ce0
Esta función:
- Descomprime algo ( FUN_00405fe2)
- Busca extensiones de archivo
- Busca direcciones
- Busca funciones de criptografía
Random String Generator
FUN_00401225 genera random strings. Puede usarse como seed el nombre de la computadora.
FUN_00401b5f - Crear Directorio Aleatorio
- Crea un directorio aleatorio en C:\ProgramData
- Retorna 1 en éxito, 0 en falla
- La variable _Count_0040f40c puede no parecer un integer; limpiar con opciones
- Si el directorio no existe, llama FUN_00401af
Copia de Archivo
Copia tasksche.exe al directorio creado. Si la creación es exitosa, llama FUN_00401f5d.
FUN_00401ce8 - Crear Servicio
- OpenServiceA: intenta crear un servicio nombrado con el random string ( lpMultiByteStr_0040f8ac)
- Renombrar a “createtaskscheservice”
Mutex
Intenta adquirir un mutex para asegurar que dos binarios no se ejecuten simultáneamente. Mutex viene de “mutual exclusion”, una propiedad de control de concurrencia para prevenir race conditions.
Gestión de Directorios
- Obtiene la ruta del archivo y usa SetCurrentDirectoryA
FUN_004010fd - Registry Operations
- HKEY 0x80000002** = HKEY_LOCAL_MACHINE
- HKEY 0x80000001** = HKEY_CURRENT_USER
- Si param_1 == 0: consulta el registro e instala en variable local_2e0
- Si param_1 != 0: crea una nueva clave y almacena el directorio actual
- Renombrar a “setorqueryregistry”
Firma de Función Incorrecta
A veces el decompiler solo ve un argumento cuando hay más. Solución: Edit Function signature para definir los argumentos correctamente.
FUN_00401dab - Extracción de Recursos
Busca el recurso 2058:
- Está protegido por contraseña zip
- Contraseña: WNcry@2ol7
- Renombrar a “extractresource”
Resource 2058
Contiene:
- b.wnry:** Imagen de fondo
- r.wnry:** Nota de ransomware
- c.wnry:** Dominios Tor
FUN_00401e9e - Direcciones BTC
Contiene direcciones BTC. Renombrar a “selectbtcaddress” — selecciona aleatoriamente una dirección BTC.
FUN_00401000 - Leer/Escribir c.wnry
Leer o escribir archivos ( wb? rb?). Las variables DAT_0040e018 y DAT_0040e01c pueden no reconocerse correctamente. Renombrar a “readorwritecwnry”.
FUN_00401fe7 - Main
- FUN_00401064 ejecuta un comando ( runcommand)
- Attrib +h: Establece el atributo de archivo oculto
- Icacls: Modifica permisos de archivo o carpeta
- /t: Realiza la operación en todos los archivos especificados en el directorio actual y subdirectorios
FUN_00401437
Usa la convención de calling thiscall. Ver: https://docs.microsoft.com/en-us/cpp/cpp/thiscall?view=msvc-170
Criptografía
FUN_00401861 - RSA
Usa RSA KEY o FUN_004018f9 ( createFile, ReadFile). FUN_00401437 importa la clave desde archivo o usa la clave por defecto. Retorna 1 en éxito y 0 en falla.
FUN_004014a6 - Procesamiento de Archivo
- Param2 como filename
- Local_28 es el tamaño del archivo
Stripped Binaries
Es posible compilar y crear binarios stripped ( sin tabla de símbolos):
gcc -s: Elimina toda información de tabla de símbolos y relocalización
strip: Descarta símbolos de archivos objetoPara encontrar main () en binarios stripped, ver: https://www.youtube.com/watch?v=N1US3c6CpSw&abchannel=LiveOverflow
Binary Diffing
diff es una herramienta de comparación de datos que computa y muestra diferencias entre contenidos de archivos. Binary diffing puede ayudar a comparar binarios y detectar modificaciones, especialmente útil para:
- Muestras de malware Herramientas:
- Diaphora:** Advanced program diffing tool, trabajando como plugin de IDA
- http://diaphora.re/
- https://github.com/FernandoDoming/r2diaphora
- Joxean Koret - Diffing C source codes to binaries**
- https://www.youtube.com/watch?v=UVIKXxMI_Lg&abchannel=ZeroNights
Recursos Útiles
- Ghidra scripts: https://github.com/ghidraninja/ghidrascripts
- Yara: Para encontrar patrones de criptografía
- Full analysis of encrypted sections: https://www.youtube.com/watch?v=ru5VzUigKqw&abchannel=stacksmashing
OpenSCManager
OpenSCManager: Establece una conexión con el service control manager en la computadora especificada y abre la base de datos del service control manager. OpenServiceA: Abre un servicio existente. El servicio se llama “mssecsvc2.0”.