Hace algunos días, tuve la oportunidad de analizar unas muestras empaquetadas con herramientas que no suelen verse demasiado. Si bien las que recibimos a diario en nuestro Laboratorio de Investigación de ESET Latinoamérica presentan packers muy diversos, la mayoría de ellas no se encuentran empaquetadas, o tienen alguna versión de UPX. Por tal motivo, me pareció una buena idea analizar esas muestras en este post, de tal modo de realizar el unpacking en forma práctica.
Cuando tomamos la primera, DownAndRun.exe, el análisis estático básico nos dice que el ejecutable se encuentra empaquetado con ASPack. Así, si intentamos ver los imports del archivo binario, nos encontraremos con que las librerías son visibles, pero solamente se muestran uno o dos imports por librería. Claramente, si intentamos realizar un análisis estático más minucioso con la ayuda de un desensamblador como IDA Pro, obtendremos el código para las rutinas de unpacking. El código propio del ejecutable no será interpretado, e incluso no estará disponible en esta etapa del análisis. En la siguiente imagen se observa lo que hemos mencionado:
Ante esta situación, abriremos el ejecutable con OllyDbg, de tal modo de encontrar el tail jump y, consecuentemente, el Original Entry Point (OEP) de nuestra muestra. Inicialmente la ejecución quedará pausada al comienzo de la rutina principal de desempaquetamiento. Si tenemos en cuenta que lo último que realizará el código del packer es transferir el control al OEP, una estrategia muy interesante consiste en observar qué direcciones del stack se escriben al principio del código del packer, con la esperanza de que se realice la operación inversa en las últimas instrucciones. Afortunadamente, vemos que la primera instrucción es PUSHAD, que guarda todos los registros generales en el stack:
Por ello, pondremos un breakpoint por hardware, de acceso, en alguna de esas direcciones del stack. Si todo sale bien, lo último que hará la rutina del packer es ejecutar un POPAD, seguido del código con el salto al OEP. Puede verse en la imagen que ESP apunta a 0x12FF8C antes de la ejecución; luego, pondremos el breakpoint en 0x12FF88. Al dar continuidad a la ejecución, vemos que el breakpoint es alcanzado:
Encontramos el POPAD y un salto a una dirección de memoria lejana: he aquí el tail jump. Así, vemos que el OEP está en 0x458D9C. Si continuamos ejecutando instrucción por instrucción, llegaremos al OEP, pero podremos observar que OllyDbg no interpreta las instrucciones, dado que ellas han sido generadas recientemente por el código del packer:
En este punto, el ejecutable original ya está desempaquetado en memoria. Luego, podemos utilizar algún plugin como OllyDumppara volcar el ejecutable al disco. Este plugin intentará, además, reconstruir los imports y arreglar el encabezado PE. Sin embargo, si esta operación falla, podrá utilizarse otra herramienta como ImpRec. Si ahora analizamos el ejecutable obtenido, DownAndRun_.exe, vemos que han aparecido más imports que antes:
Si realizamos un procedimiento similar para otra muestra empaquetada con PECompact, Visualizar_Intimacao.cpl, nos encontraremos con diversas técnicas anti-debugging, especialmente mediante el lanzamiento de excepciones. Además, veremos que el breakpoint será alcanzado varias veces desde diversas secciones de memoria, hasta llegar a la parte que nos interesa:
Vemos un tail jump típico, seguido de bytes en cero: hemos encontrado el OEP en 0x4671E4. A partir de aquí, el ejecutable original puede dumpearse en disco para un mejor análisis de la amenaza.
SHA-1 de las muestras analizadas:
089289ceaa4dd86e0141b26ba8dd380ae9a6555a - DownAndRun.exe
b8fc98c48a25816ed1e8fa1173c47ee3d9c2bc52 - Visualizar_Intimacao.cpl