La semana pasada estuvimos analizando un caso práctico de cómo aplicar Yara para buscar imágenes geolocalizadas. Si bien Yara es una herramienta cuya mayor utilidad se encuentra en la clasificación de malware, puede ser utilizada con diversos fines. En esta oportunidad se explorará un ejemplo que puede aplicarse a cualquier archivo ejecutable con encabezado PE, sea malicioso o no, para determinar si ha sido compilado recientemente.
Si se analiza el encabezado PE de un archivo ejecutable con alguna aplicación como PEview, puede encontrarse mucha información relevante para el análisis de malware. Así, se encontrará información acerca de las secciones que conforman el archivo ejecutable: de datos, código o recursos, por ejemplo. De haber secciones con nombres atípicos, o de la observación de que el tamaño en bytes de estas secciones es mucho menor en el archivo que en memoria, podrá pensarse en la presencia de algún packer para dificultar el análisis estático del archivo. Adicionalmente, pueden consultarse otros datos como el tipo de subsistema de ejecución utilizado (consola o interfaz gráfica) o la fecha y hora de compilación del ejecutable. Es este último dato el que se tomará en este post, para clasificar rápidamente archivos ejecutables con Yara de acuerdo con su "edad".
En la imagen de arriba se observa este campo para un archivo ejecutable addon.cpl. Puede verse que el tiempo que ha pasado desde que fue compilado el ejecutable es de aproximadamente un mes. Ahora bien, el problema que presenta el uso de este tipo de herramientas es que no resultan prácticas cuando se quieren aplicar a cientos o miles de archivos. Sin embargo, como ya se sabe de antemano dónde encontrar esta información dentro del encabezado del archivo, es posible realizar la verificación con reglas de Yara. Para empezar, se abrirá otro archivo ejecutable con PEview para comparar el campo Time Date Stamp:
Puede observarse que, para este ejecutable, el campo Time Date Stamp se encuentra en la dirección 0xF0, mientras que en el archivo que se analizó antes el campo se encontraba en la dirección 0x108. Luego, surge la pregunta: si la ubicación de este campo varía, ¿cómo crearemos una regla para leerlo?
En IMAGE_DOS_HEADER el último campo indica la dirección dentro del archivo donde se encuentra el nuevo encabezado EXE; es decir, IMAGE_NT_HEADERS. Lo más importante de esto es que IMAGE_DOS_HEADER siempre va a estar en la misma posición para cualquier archivo ejecutable, con lo cual basta crear una regla que lea el campo en la dirección 0x3C para obtener la ubicación de IMAGE_NT_HEADERS.
Puede observarse que primero se lee el valor en 0x3C, luego se le suma 8 bytes (el desplazamiento hasta el campo Time Date Stamp), y luego se interpreta este valor como un número entero de segundos. Las variables min_secs y max_secs son parámetros especificados por consola cuando se ejecute Yara con la regla timeDateStamp. Cabe destacar que el formato de fecha y hora utilizado en el campo Time Date Stamp es UTC, con lo cual se almacena la cantidad de segundos desde el 1 de enero de 1970 a las 00:00:00. Por lo tanto, si queremos utilizar esta regla, debemos apoyarnos en algún servicio que convierta una fecha a UTC, o viceversa. Comprobemos esto último con los valores que se observan en la primera imagen en este post. Si se convierte la fecha "27/11/2013, 17:41:57 hs" a segundos UTC, se tiene el valor decimal 1385574117. Esto es equivalente a 52962EE5 en hexadecimal, lo cual se corresponde con lo que vemos en la imagen.
Imagen de geralt en pixabay. Licencia CC0 1.0