Análisis de malware
Reconociendo el malware empaquetado y sus métodos de desempaquetado – Parte 2
noviembre 3, por Ninja de seguridad
En la Parte 1 de esta serie de artículos, analizamos las formas de reconocer ejecutables empaquetados y varias formas de automatizar el proceso de descompresión. En este artículo, veremos el proceso manual de descomprimir una muestra de malware empaquetada.
En el último artículo, vimos cómo la muestra de malware estaba empaquetada con UPX y utilizamos la utilidad UPX para descomprimirla. Pero imagínese si tenemos un empaquetador personalizado para el cual no hay un desempaquetador directo disponible. En ellos, debemos adoptar el enfoque manual para llegar al Código Original para un análisis más detallado.
Sabemos que cuando el programa se ejecuta, está disponible en el código original en la memoria, por lo que si volcamos la memoria de un proceso en ejecución empaquetado, podemos tener lo que se llama una muestra desempaquetada. Podemos utilizar herramientas como Scylla, Import Fixer, etc. para volcar la memoria de un proceso en ejecución.
A continuación se muestra una instantánea de Scylla donde primero debemos adjuntarle el espécimen de malware activo para extraer el contenido de su memoria. Debería estar ejecutando el proceso. Si intentamos adjuntar el proceso en estado de pausa e intentamos cargar IAT, entonces no puede encontrar ningún IAT en el OEP mencionado. El mismo error se puede ver en rojo a continuación en la captura de pantalla. Por lo tanto, asegúrese de que la muestra se esté ejecutando en el depurador. Además, tenga en cuenta que el OEP que se menciona a continuación no tiene por qué ser el OEP real y debemos encontrar el valor real (más sobre esto más adelante).
Después de ejecutar el proceso en un entorno controlado, podemos ver el siguiente mensaje de éxito «IAT encontrado» enviado a OEP.
Una vez que tengamos el IAT creado, podemos hacer clic en Obtener importaciones para obtener toda la información de importaciones a las que este espécimen realiza llamadas. Podemos ver aquí que están en verde, por lo que podemos simplemente hacer clic en volcar para volcar una copia de esto.
Sin embargo, existen pocos desafíos a la hora de analizar muestras desechadas.
- Es posible que el proceso recién descargado tenga una IAT no válida o corrupta. Con herramientas como Scylla, podemos construir automáticamente el IAT.
- Incluso después de corregir el IAT, es posible que la muestra no se pueda ejecutar porque es posible que el punto de entrada original no apunte a la dirección correcta. Espera, punto de entrada original (OEP), ¿qué es eso? Hay un punto de entrada mencionado en el encabezado PE de una muestra que especifica la primera instrucción que debe ejecutarse. Dado que estamos examinando la muestra de malware empaquetada, el punto de entrada especificará el código de descompresión que se debe ejecutar primero para descomprimir el programa. En cambio, OEP apunta a la dirección del código original.
Para llegar al OEP y volcar el proceso desde allí, cargaremos el programa en OllyDbg. Antes de cargar, asegúrese de borrar la bandera ASLR del espécimen (para obtener más detalles sobre cómo arreglar ASLR, consulte la Parte 1 de esta serie de artículos). Después de eso, cargue el programa en OllyDbg. Mientras examina un espécimen empaquetado en UPX, busque una instrucción de salto seguida de muchos ceros. A veces debemos adoptar un enfoque de un solo paso para saber cuándo comienza la OEP, pero a veces hay sugerencias que podemos usar para ver la llamada a la OEP directamente.
- Si la muestra está empaquetada con UPX, busque la instrucción JMP seguida de instrucciones con muchos ceros.
- Esté atento a la instrucción CALL EAX ya que muchos empaquetadores almacenan el valor de OEP en el registro EAX.
- Esté atento a los empujones de pila y limpie porque normalmente se limpiarán antes de que el código se transfiera a OEP.
- También podríamos enfrentarnos a situaciones en las que un autor malintencionado utilizara TLS para ejecutar el código antes del OEP. En estos casos, debemos asegurarnos de reconocer estas funciones de devolución de llamada TLS y ver el contexto exacto de esa función de devolución de llamada TLS. Por ejemplo, es posible que la función TLS incluya técnicas como el vaciado de procesos, que podría llevar nuestro análisis a un proceso diferente (que ha sido vaciado) para ver el contenido del nuevo código que se ha insertado.
A continuación se muestra una captura de pantalla de nuestro espécimen cargado en OllyDbg. Como sabemos que esta muestra está empaquetada en UPX, debemos estar atentos a las instrucciones JMP antes de los ceros.
Esta instrucción jmp indicará el final del código de descompresión. Para un análisis controlado, establezca allí un punto de interrupción. ¿Alguna idea de cuál es esta dirección? Sí, es OEP.
Ahora que sabemos que este puede ser el OEP real, podemos volcar el contenido usando la utilidad de volcado OllyDBG. A continuación se muestra una captura de pantalla del mismo. Necesitamos hacer clic en «Obtener EIP como OEP» para reemplazar el valor del Punto de entrada.
Luego de ese clic, Dump y OllyDbg te pedirán la confirmación con todos los cambios mencionados.
Ahora todavía necesitamos arreglar el IAT y las tablas de importación, así que abra Scylla y vuelva a adjuntarle la muestra de malware. Reemplace el valor de OEP con lo que hemos descubierto anteriormente. Luego haga clic en «Obtener importaciones».
Una vez que se resuelvan todas las importaciones, haga clic en Fix Dump y señale el proceso que descargamos de OllyDbg. Se creará un nuevo proceso con el nombre SCY agregado al proceso volcado. Este nuevo proceso ahora se puede ejecutar y ahora podemos realizar análisis estáticos, dinámicos y de código en él.
Entonces, en este artículo, hemos visto cómo hemos usado Scylla y OllyDBG para encontrar OEP, corregir IAT e importaciones para crear un proceso desempaquetado en ejecución.