Presentamos The Lord Of The Strings, una herramienta de código abierto desarrollada en ESET Latinoamérica para extraer los strings relevantes de una muestra maliciosa, detectando y eliminando automáticamente los strings basura.
The Lord Of The Strings (LOTS) es una herramienta para Linux gratuita y de código abierto desarrollada en ESET Latinoamérica, la cual se encuentra disponible para su descarga en GitHub, que tiene como objetivo facilitar el análisis de strings extraídos de una muestra maliciosa al eliminar automáticamente los strings basura, acelerando así los tiempos y permitiéndole al analista enfocar toda su atención en los strings que realmente son importantes.
¿Para qué sirve el análisis de strings?
Los analistas de malware suelen realizar análisis de dos tipos sobre las muestras de malware:
- Análisis estático: Aquellos que se realizan sobre la muestra sin necesidad de ejecutarla. Por ejemplo: desensamblar el código de un ejecutable, analizar los recursos que contiene, que bibliotecas utiliza, etc.
- Análisis dinámico: Aquellos que implican ejecutar la muestra maliciosa. Por ejemplo: analizar el tráfico de red, monitorear las llamadas al sistema, monitorear los archivos modificados, utilizar un debugger, etc.
Uno de los análisis estáticos más básicos que suele realizarse sobre malware compilado es el análisis de strings. Este consiste en extraer, sin ejecutar la muestra, todos los strings del archivo para luego ser revisados uno a uno por el analista.
El tipo de información que puede ser obtenida mediante este método varía según la muestra, el tipo de malware del que se trate y las protecciones anti-análisis que posea. Sin embargo, generalmente suele ser muy útil y puede servir como una primera aproximación a partir de la cual definir los siguientes pasos del análisis.
A continuación, se enumeran algunas de las múltiples cosas interesantes que se pueden encontrar al analizar los strings:
Bibliotecas utilizadas | Nombres de archivos escritos en el sistema |
Funciones de la API del SO utilizadas | Comandos ejecutados en el sistema |
Blancos a los que apunta la amenaza | Direcciones del registro modificadas |
Direcciones IP a las que se conecta | Mensajes que muestra al usuario |
Sitios web a los que se conecta | Tecnologías que utiliza |
Direcciones de bitcoin a las cuales transferir rescates | Protecciones anti-análisis que utiliza |
Rutas en las cuales copia o escribe archivos | Datos del compilador |
¿Qué herramientas para el análisis de strings hay disponibles actualmente?
Existen muchas herramientas para obtener dichas strings, siendo las más famosas: Strings de Sysinternals para Windows y strings para Linux. El proceso realizado por estas herramientas consiste en recorrer el archivo binario y extraer todas las secuencias de bytes que sean similares a un string; es decir, aquellas que terminan en 0x00 en el caso de strings ASCII o en 0x0000 en el caso de strings unicode.

Ejemplo de string contenido en un archivo, donde puede observarse que su representación hexadecimal termina en 0x00
Como es de suponer, este tipo de herramientas presenta una gran cantidad de falsos positivos, ya que cualquier secuencia de bytes con estructura similar a un string será considerada un string válido. Mas aún, la cantidad de strings extraídos generalmente aumenta proporcionalmente al tamaño del archivo, con lo cual a partir de una muestra de tan solo algunos megabytes pueden obtenerse cientos de miles de falsos positivos.

Output de ejecutar Strings de SysInternals sobre una muestra maliciosa, donde pueden observarse strings relevantes para el análisis y strings irrelevantes (basura)
¿Cuál es la diferencia con LOTS?
Los strings falso positivo o strings basura son claramente identificables para el analista. Sin embargo, al necesitar ser analizados individualmente, la cantidad comienza a representar una complicación y un retraso en el proceso de análisis. Aquí es donde entra en juego LOTS, cuyo objetivo es descartar automáticamente los strings basura para que el analista pueda enfocar sus esfuerzos únicamente en los strings reales y útiles.
Dada la variabilidad de los strings que pueden encontrarse en una muestra de malware, conteniendo en muchos casos nombres, abreviaturas, números, símbolos, palabras inventadas, longitud y características variables, etc., se optó por utilizar un algoritmo de inteligencia artificial basado en que puedan ser fácilmente extraídos de cada string. De esta manera, se pretende lograr que el algoritmo emplee un criterio similar al que utilizaría un analista para poder discernir si un string es real o es un falso positivo.
Las pruebas realizadas sobre varios sets de datos revelaron una precisión de clasificación de aproximadamente el 97%, tratándose así de una herramienta rápida, precisa y práctica para facilitar el proceso de análisis.
A continuación, puede observarse una comparación entre el resultado de la herramienta strings de Linux y el resultado de LOTS para la misma muestra maliciosa:
Con LOTS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
!This program cannot be run in DOS mode. Rich .text @.data .rsrc TOpRj TOpRj uNSW Delete NoRemove ForceRemove CreateFileW CreateFileA GetModuleHandleA GetModuleHandleW GetModuleFileNameA kernel32.dll GetModuleFileNameW error occured SKyu invalid distance too far back invalid distance code invalid literal/length code too many length or distance symbols invalid distances set invalid bit length repeat invalid literal/lengths set invalid code lengths set invalid stored block lengths invalid block type incorrect length check incorrect data check header crc mismatch unknown header flags set incorrect header check invalid window size unknown compression method incompatible version buffer error insufficient memory data error stream error file error stream end need dictionary bad allocation Visual C++ CRT: Not enough memory to complete call to strerror. CorExitProcess runtime error An application has made an attempt to load the C runtime library incorrectly. |
Con la herramienta strings de Linux:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
!This program cannot be run in DOS mode. Rich .text `.rdata @.data .rsrc QRPV QRPV QUVW [_^]Y Qj@SP Pj@SW L$(WQ RPSW VWP3 L$Pj +t$ SV uP9D$ t hx3B hh1B SUVW _^][ t>%F _^][ _^][ D$3UV D$(W D$4x D$5a D$>f D$A3 D$Dt D$9b t:;L$ t:;L$ PGWS WPWUj VPWUj _^][ VPWUj VPWUj _^][ QRVW }3@u E#+E/_^ZY }3@u }3@u% }3@u& }3@u }3@u |
Se puede notar claramente que el resultado obtenido al utilizar LOTS es mucho más pequeño que el de strings, lo cual se debe, justamente, a la eliminación de los strings basura.
Esperamos que esta herramienta sea de utilidad para toda la comunidad de analistas de malware, permitiendo reducir los esfuerzos empleados en estas tareas, acelerar los tiempos de análisis y automatizar procesos.
Discusión