Análisis de malware

Más elusión de técnicas antianálisis de malware

13 de junio de por Ninja de seguridad

En los últimos artículos, hemos visto cómo el malware emplea algunas técnicas antianálisis y cómo podemos evitar esas técnicas. Ahora, elevemos el listón un poco más y busquemos técnicas de antianálisis más avanzadas.

En este artículo, veremos cómo podemos alcanzar el punto de entrada original de un archivo Exe empaquetado y luego cómo el malware puede engañar para anular el controlador de excepciones estructurado (SEH).

Empecemos.

Tenemos una muestra de malware (llamada sample.exe) y, al cargarla en ExeInfo, parece estar empaquetada. He ocultado intencionalmente el nombre del empaquetador porque sería fantástico tratarlo como uno personalizado y luego analizar el malware.

Tenga en cuenta que el punto de entrada es 28E8.

Además, comenzamos a depurarlo, asegurémonos de que el ASLR no esté marcado para evitar problemas relacionados con la carga dinámica más adelante. Al observar las características de la DLL, podemos ver que esta DLL no se puede mover.

Ahora, al cargar este ejemplo dentro de OllyDBG, nos presenta una advertencia de que el código se puede comprimir, que es lo que hemos visto antes.

Tan pronto como la muestra se cargue en OllyDBG, comenzará a funcionar en el código Unpacker, pero revisar manualmente este código llevará mucho tiempo y es posible que nos perdamos el OEP. Analicemos algunas líneas de código donde hemos aterrizado.

Hay algunas referencias a FS[0] que apuntan a estructuras SHE. ¿Estamos tratando con controladores de excepciones aquí? Vamos a averiguar. Antes de continuar, es importante saber cómo Windows localiza la dirección del registro FS. El registro FS apunta al bloque de información de subprocesos (TIB), que contiene información sobre el subproceso en ejecución actual y el puntero al inicio de la cadena SHE reside en TIB en el desplazamiento 0x00.

Ahora, veamos el controlador de excepciones de estructura.

El registro SEH único consta de dos elementos en la pila y este proceso se conoce como _Exception_Registration. Esos dos elementos que forman un registro SEH son:

Por tanto, forma una estructura de cadena SEH.

Ahora, con la comprensión anterior, veamos qué hace el código. Tan pronto como se carga el código, se copia 519870 a EAX y se coloca en la parte superior de la pila.

Podemos mirar la parte superior de la pila para este impulso con ESP apuntando a 14FF80.

Según la explicación anterior de SEH, este es el código de la función del controlador, pero aún debe ser señalado por FS[0], lo cual se realiza mediante la siguiente línea de código PUSH DWORD PTR FS:[0]. Esto empujará el puntero al inicio de la cadena SEH hacia la parte superior de la pila y completará el registro SEH. El estado actual de los registros en este momento es el siguiente

La declaración with MOV DWORD PTR FS:[0], ESP; El código designa el registro recién creado en la parte superior de la cadena SEH moviendo ESP (que apunta a la parte superior del registro) a FS: [0]. Después de ejecutar esta declaración, podemos ver que la pila indica dos elementos del registro SEH.

También podemos en la cadena VEH/SEH que se cree un nuevo registro.

Sin embargo, el código de muestra debe ejecutar este código de controlador SEH. No tenemos que ir demasiado lejos para descubrirlo ya que la siguiente línea de código XOR EAX, EAX que pone 0 en EAX

y luego intenta escribirlo en una ubicación de solo lectura, lo que provoca una excepción. El primer controlador detecta esta excepción y luego se ejecuta el código de desempaquetado.

Además, al ejecutar la última declaración recortada, saltará a 519870 (recuerde que esta es la dirección que ingresamos en el registro EAX anteriormente y es la función de controlador SEH que forma parte del registro SEH)

Vaya, qué técnica tan inteligente se empleó para ocultar el código desempaquetador, pero nuestro trabajo aún no ha terminado porque todavía necesitamos encontrar el OEP, extraer el código desempaquetado del binario y reconstruirlo, lo cual es complicado.

Intentaré aportar experiencia aquí buscando algunos patrones comunes que los empaquetadores suelen utilizar justo antes de descomprimir el código. Una es buscar los patrones en el código desempaquetador para un salto de EAX que suele ser un salto al código desempaquetado. Además, los empaquetadores suelen limpiar la pila antes de descomprimir el código, por lo que debemos fijarnos en ese orden:

Limpieza de la pila – seguida de un JMP EAX.

Una vez que estemos en 519870 (código de controlador SEH), podemos recorrer cada instrucción o podemos configurar un punto de interrupción a lo largo de la creación del registro SEH. Sigamos el segundo enfoque .

Sabemos que cuando se crea SEH en el sistema y dado que estamos en la heurística de que limpiará la pila, coloquemos un punto de interrupción en la parte superior de la pila cuando se cree la estructura.

Y luego, al ejecutar la muestra, nos lleva a la siguiente sección de código.

Esto coincidía con los patrones que estábamos buscando. Ejecutemos JMP eax y luego veamos a dónde nos llevará este código:

Vea cómo el código 28E8 ahora se ve más limpio y desempaquetado. Vamos a deshacernos de este código

Todavía tenemos que comprobar si este código volcado se ejecutará o no. Antes de ejecutarlo, construyamos la tabla de direcciones de importación.

Ahora que el archivo está listo, analicemos si el exe se está ejecutando o no en Process Hacker. Tan pronto como se inicia el exe, da un error.

Lo interesante es que fue solo para desviar a la gente de la preocupación al arrojar un mensaje de error porque incluso después de hacer clic en Aceptar, podemos ver en el proceso hacker que el proceso se está ejecutando y genera un proceso.

¡Conviértete en un ingeniero inverso certificado!

Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender

Entonces, se trata de esta técnica de cómo un autor malicioso puede empaquetar el código y frustrar el análisis.