Una herramienta de ingeniería inversa para binarios compilados de Nim
Investigación ESET
Disponible como complemento IDA y script de Python, Nimfilt ayuda a realizar ingeniería inversa en archivos binarios compilados con el compilador del lenguaje de programación Nim decodificando nombres de paquetes y funciones y aplicando estructuras a cadenas.
23 de abril de 2024
•
,
5 min de tiempo de lectura

El nim El lenguaje de programación se ha vuelto cada vez más atractivo para los desarrolladores de malware debido a su robusto compilador y su capacidad para trabajar fácilmente con otros lenguajes. El compilador de Nim puede compilar Nim convierte a JavaScript, C, C++ y Objective-C y es compilable de forma cruzada para los principales sistemas operativos como Windows, Linux, macOS, Android e iOS. Además, Nim admite la importación de funciones y símbolos de los idiomas anteriores, así como la importación desde bibliotecas vinculadas dinámicamente para Windows y bibliotecas compartidas para Linux. También están disponibles módulos contenedores Nim, como: b. Winimque hacen que la interacción con el sistema operativo sea sencilla. Todas estas características permiten que Nim se integre fácilmente en procesos de desarrollo con estos lenguajes y promueva el desarrollo de nuevas herramientas, tanto benignas como maliciosas.
No sorprende que ESET Research haya observado el uso continuo de malware desarrollado por Nim en la naturaleza. Sednit ya estaba en 2019. descubierto con un descargador malicioso escrito en Nim. Otro grupo infame que juega el juego de Nim y el impulso para su desarrollo. nimfiltes el panda mustang Grupo APT. Investigación de ESET registrada Mustang Panda con Nim en su conjunto de herramientas por primera vez en una campaña contra una organización gubernamental en Eslovaquia en agosto de 2023. Se detectó la DLL maliciosa, y como parte del clásico Tridente Cargador Korplug: fue escrito en Nim.
Para los investigadores encargados de realizar ingeniería inversa en dichos binarios, Nimfilt es una herramienta poderosa para acelerar el análisis. Nimfilt se puede ejecutar como un script de Python tanto en la línea de comando (con un subconjunto de su funcionalidad) como en Hex-Rays. AIF Programa, aquí se presenta principalmente como un complemento de Python para IDA.
Inicializando Nimfilt en IDA
Cuando se abre IDA por primera vez, carga e inicializa todos los complementos en el directorio de complementos de IDA. Durante la inicialización de Nimfilt, el complemento utiliza heurística básica para determinar si el binario desensamblado se ha compilado utilizando el compilador Nim. Si se supera alguna de las siguientes comprobaciones, Nimfilt determina que se utilizó este compilador:
- El archivo binario contiene las dos cadenas siguientes:
- El binario contiene uno de los siguientes nombres de funciones de Nim conocidos:
- NimPrincipal
- NimPrincipalInterior
- NimMódulo principal
- El binario contiene al menos dos de las siguientes cadenas de mensajes de error:
- @Valor fuera de rango
- @Dividir entre cero
- @Desbordamiento o subdesbordamiento
- @Índice fuera de los límites
Las reglas YARA se proporcionan junto con Nimfilt, que realiza comprobaciones similares para determinar si un archivo ELF o PE se compiló con Nim. En conjunto, estos controles son mucho más sólidos que el enfoque adoptado por otras herramientas, como b. solo reconóceloactualmente solo eso .rdata Sección de los archivos PE para la cadena. io.nim o fatal.nim.
Como paso final de inicialización, si Nimfilts AUTO_RUN bandera se establece en verdadero, el complemento se ejecutará inmediatamente. De lo contrario, Nimfilt se puede ejecutar como de costumbre desde el menú de complementos de IDA, como se muestra en la Figura 1.

Desenredar con Nimfilt
Nim utiliza un esquema de corrupción de nombres personalizado que Nimfilt puede decodificar. Durante una ejecución, Nimfilt recorre cada nombre de función en el binario y verifica si el nombre es un paquete Nim o un nombre de función. Los nombres descubiertos cambian de nombre a sus formas desfalsificadas.
Curiosamente, estos nombres pueden revelar información sobre el entorno del desarrollador, similar a las rutas PDB. Esto se debe a que el compilador de Nim agrega la ruta del archivo al nombre cuando se modifica; Nimfilt revela la ruta cuando se modifica.
Por ejemplo, los nombres de funciones de paquetes de terceros se almacenan como rutas absolutas durante el proceso de manipulación. La Figura 2 muestra el nombre de una función almacenada como una ruta absoluta y la versión y suma de verificación de la nimSHA2 paquete utilizado y la ruta de instalación del desarrollador para ágil – Administrador de paquetes predeterminado de Nims.
Python nimfilt.py GET_UINT32_BE__6758Z85sersZ85serOnameZOnimbleZpkgs50Znim837265504548O49O494554555453d57a4852c515056c5452eb5354b51fa5748f5253545 05752cc56fdZnim83726550_u68
C:/Users/user.name/.nimble/pkgs2/nimSHA2-0.1.1-6765d9a04c328c64eb56b3fa90f45690294cc8fd/nimSHA2::GET_UINT32_BE u68
Figura 2. Descifrando el nombre de una función de un paquete de terceros
Por el contrario, la Figura 3 muestra el nombre de una función de un paquete Nim estándar almacenado como una ruta relativa (es decir, relativa a la ruta de instalación de Nim).
Python nimfilt.py toHex__pureZstrutils_u2067
rienda/strutils::toHex u2067
Figura 3. Decodificando el nombre de una función de un paquete Nim estándar
Sin embargo, los nombres no siempre se mutilan de la misma manera. La Figura 4 muestra que el mismo nombre de función que el anterior del paquete nimSHA2 se almacena como una ruta relativa en Linux.

Figura 4. Descifrando el nombre de una función de un paquete de terceros en Linux
Las funciones de inicialización de paquetes se modifican de una manera completamente diferente: el nombre del paquete se almacena como una ruta de archivo (incluida la extensión del archivo) colocada antes del nombre de la función, y se utiliza un esquema de escape para representar ciertos caracteres como barras diagonales, guiones y puntos. . Al manipular, Nimfilt desinfecta el nombre del paquete eliminando el .nim Extensión de archivo como se muestra en la Figura 5.

Figura 5. Descifrando el nombre de una función de inicialización de un paquete de terceros
La Figura 6 muestra cómo los nombres de las funciones de inicialización de los paquetes nativos se almacenan como rutas absolutas.
Python nimfilt.py atmCatcatstoolsatsNimatsnimminus2dot0dot0atslibatssystemdotnim_Init000
C:/herramientas/Nim/nim-2.0.0/lib/system::Init000
Figura 6. Decodificando el nombre de una función de inicialización de un paquete nativo
En IDA, al proceso de descifrado de nombres de Nimfilt le sigue la creación de directorios en la ventana de funciones para organizar las funciones según su nombre de paquete o ruta, como se muestra en la Figura 7.

Aplicar estructuras a cadenas Nim
La acción final realizada durante la ejecución de Nimfilt es aplicar estructuras tipo C a las cadenas de Nim. Así como las cadenas en algunos otros lenguajes de programación son objetos y no cadenas de bytes terminadas en nulo, también lo son las cadenas en Nim. La figura 8 muestra cómo la cuerda A B C D E F Aparece en IDA antes y después de ejecutar Nimfilt. Tenga en cuenta que un binario compilado por Nim en forma desensamblada tiene el prefijo _TM como parte del nombre temporal de algunas variables; Suelen ser cadenas de Nim.

Nimfilt revisa todas las direcciones del .rdata o .rodata segmento y busque cadenas de Nim en cualquier otro segmento de datos de solo lectura. Las estructuras se aplican a todas las cadenas reconocidas. La estructura contiene un campo de longitud y un puntero a la carga útil que consta de los caracteres de la cadena.
Envolver
En camino a ser compilado como ejecutable, el código fuente de Nim generalmente se traduce a C o C++. Sin embargo, este proceso no elimina todos los rastros de Nim. Al viajar a través del código fuente del compilador de Nim, desciframos algunas de las rutas tomadas en el proceso de compilación, lo que nos permitió crear Nimfilt como una herramienta Python y un complemento IDA para ayudar con este desentrañamiento.
En resumen, ya sea que sea nuevo en Nim o no, Nimfilt hará que su trabajo de ingeniería inversa con archivos binarios compilados por Nim sea más fácil y más enfocado casi de inmediato. Sin embargo, el desarrollo de Nimfilt no se ha detenido en absoluto. Estamos trabajando en funciones adicionales para manejar la doble confusión y mejorar el formato de los nombres confusos y la agrupación de nombres de paquetes.
Hemos recibido este contenido de ciberseguridad de: Welivesecurity (blog ESET sobre amenazas de seguridad informática)
Llegarás a la noticia original en el siguiente enlace: https://www.welivesecurity.com/en/eset-research/introducing-nimfilt-reverse-engineering-tool-nim-compiled-binaries/
write a shot sentence in spanish about who ESET, the Cybersecurity company»
