Análisis de nls_933w.dll (II)

En la anterior entrada analizamos ciertas características estáticas que nos daban una idea de lo que hace o lo que podría llegar a hacer la librería. Ahora en esta segunda entrada vamos a analizar las funciones que exporta la librería. Para el análisis estático de la librería nos vamos a apoyar en las herramientas radare2, pestudio y ollydbg.

Como ya vimos en la anterior entrada con la herramienta PEstudio se exportan cinco funciones:

jh0

Ordinal 1: 0x000013F4

La primera que vamos a analizar es la función que está situada en el offset 0x000013F4 y que tiene como ordinal el número 1:

jh1

Como vemos, lo que hace la función es devolver un puntero que está almacenado en la dirección de memoria 0x1002f010+4. Si miramos qué hay en esa dirección vemos que lo que el puntero nos devolverá es lo siguiente:

jh2

La dirección devuelta es 0x10001148. En entradas posteriores analizaremos lo que hay en esta dirección. Por tanto, esta función devuelve un puntero a esta dirección: 0x10001148.

Ordinal 2: 0x000013DD

La segunda función que analizamos es la situada en el offset 0x000013DD y que tiene como ordinal el 2. Vemos como en el caso anterior el código de la función:

jh3

La función devuelve 1 en el caso de que se ejecute con éxito y ahora vamos a ver cada una de las funciones que llama. La primera que llama es 0x10001bb2:

jh4

Esta función reserva memoria en la dirección 0x1002F6C8 y copia 20 bytes desde el puntero pasado como argumento a la función.

La siguiente función  que se llama desde el código es 0x10001ca9:

jh5

Después de haber avanzado en el análisis de la función se ha visto como en su interior se llama a otra función (0x10026e10) a la que se le pasa como argumento la dirección 0x1002f024, lugar donde se ubicará código descifrado.

En la función 0x10026e10 vemos primero de todo que se utiliza el algoritmo de cifrado RC5 o RC6 para descifrar información (tal y como nos advierten en https://securelist.com/files/2015/02/Equation_group_questions_and_answers.pdf).

Un aspecto destacado es la utilización de las constantes 0xb7e15163 y 0x61c88647. Si buscamos en Google estas dos constantes, sobretodo la primera, vemos como se relaciona rápidamente con los algoritmos de cifrado RC5/RC6 (esto ya nos lo advierten en el propio pdf anterior “Equation_group_questions_and_answers.pdf” en la pregunta 15; una pena haber leído a posteriori este detalle). En el artículo nos indican como el grupo Equation utiliza estas constantes, y nos explican que utilizar la constante 0x61c88647 con una resta no es algo habitual.  A continuación vemos las constantes en la función:

jh6

Visto que la función tiene esta capacidad, nos interesa ver dónde descifra la información y qué información descifra. Haciendo un análisis de la función vemos que el punto donde guarda el resultado en memoria es en el punto resaltado en rojo en la siguiente imagen:

jh7

Para obtener qué está descifrando utilizamos ollydbg y vemos en el punto al que hacemos referencia arriba cómo se ha descifrado una porción de memoria:

jh8

Las cadenas de interés descifradas que podemos ver en la zona de memoria son:

  • “SYSTEM\CurrentControlSet\Control\Session Manager\MemSubSys”
  • win32m.sys

Por tanto esta función lo que hace es descifrar una determinada información que probablemente sea utilizada por otras partes de la librería.

Ordinal 3: 0x000013F0

Esta función es muy simple y devuelve un 1 cuando se le invoca:

jh9

Ordinal 4: 0x00001408

A la función 4 se le pasa un puntero y a partir de ahí se inicializan los siguientes words con los valores: [0, 3, 1, 0x10000]:

jh10

Según los informes que hay por la red, todo apunta a que se trata del código de versión de la DLL.

Ordinal 5: 0x00001425

Por último analizamos la función 5 que recibe dos parámetros, el primero el puntero donde se va a realizar la copia de la cadena 0x80ab y el segundo parece ser el que activa que se realice esa copia.

jh11

Con este pequeño análisis ya tenemos una idea de lo que hacen las funciones que exporta la librería. En la próxima entrada nos centraremos en la función que maneja el interface de comandos.