0x4d Binary Options


BasE91 introducción de codificación basE91 es un método avanzado para codificar datos binarios como caracteres ASCII. Es similar a UUencode o base64, pero es más eficiente. La sobrecarga producida por basE91 depende de los datos de entrada. Se asciende como máximo a 23 (frente a 33 para base64) y puede variar hasta 14, lo que ocurre típicamente en bloques de 0 bytes. Esto hace que basE91 sea muy útil para transferir archivos más grandes a través de conexiones binarias no seguras como correo electrónico o líneas terminales. Alfabeto Como su nombre indica, basE91 necesita 91 caracteres para representar los datos binarios codificados en ASCII. De los 94 caracteres ASCII imprimibles (0x21-0x7E), se han omitido los tres siguientes para construir el alfabeto basE91: La tabla de traducción se compone de los caracteres restantes como se muestra a continuación. Generación DGA rápida con Miasm Hecho famoso por el gusano Conficker, Los algoritmos de generación de dominio evitan que los ciberdelincuentes configuren una red P2P compleja para un servidor de comando y control. Sin que sea demasiado fácil para la comunidad de seguridad cerrar la infraestructura mediante el uso de direcciones IP o dominios codificados en el binario. La semilla de estos algoritmos se basa a menudo en la fecha, pero recordemos del buen Torpig viejo que también utilizó las tendencias diarias de Twitter (un truco simple pero ingenioso para prevenir el registro de los dominios antes del día actual). En este post, vamos a demostrar algunos métodos para automatizar la generación de dominios DGA, tomando el ejemplo del pequeño Locky ransomware. Método 1: transcripción manual Aquí está el rastro de la red de una ejecución de Locky el 1 de abril de 2016: El binario intenta entrar en contacto con: 4 IPs hardcoded en el binario desempaquetado entonces, si no se pudo hacer la conexión, 8 dominios que parecen una DGA La DGA Algoritmo de Locky se inicializa con una semilla de 4 bytes almacenada en una pequeña configuración dentro del binario desempaquetado: Un análisis rápido revela el objetivo de cada elemento de configuración: AffiliateId. Identificador de la red de búfer utilizado como parámetro affid en la solicitud GET para recuperar la clave pública DGASeed. DGA inicialización de semilla, 0x4d en esta muestra Sleep. Número de segundos que debe esperar antes de crear la clave de registro HKCUSoftwareLocky (por defecto: 0x1e 30s) Svchost. Copiar bajo el nombre svchost. exe (predeterminado: no) Reg. Persistance a través de la clave de ejecución de HKCU (predeterminado: no) ExcludeRussian: exclusión de sistemas rusos (predeterminado: sí) ServerIPs. Lista de 4 IPs a contactar La DGA es simple y se puede descomponer en 3 etapas: 1) el algoritmo se inicializa con la semilla anterior, así como el año, mes y día actual, a través de unas simples operaciones aritméticas. Un índice incremental también se pasa a la función a través del registro ECX 2) un bucle genera un carácter a la vez 3) la extensión se genera utilizando un índice en una cadena TLD fija El algoritmo es muy simple y se puede implementar manualmente Algunas líneas de Python (v32 () es el truncamiento a 32 bits): Let8217s ejecutar esta función para la fecha 2016/04/01: Los 8 dominios generados para este día coinciden con los de la captura Wireshark. Pero ¿qué pasa con los otros días Uno podría, obviamente, modificar la fecha en Windows y el lanzamiento de Wireshark para cada day8230 Qué tarea aburrida. Una mejor manera es generar todos los dominios para abril y mayo y comparar el resultado con una lista generada automáticamente para validar nuestra implementación. Método 2. método tradicional con GDB / Python Locky8217s DGA es muy simple y podría ser implementado rápidamente, pero si hubiera sido más complejo, wouldn8217t han sido concebibles para hacerlo completamente a mano. Un método para resolver este problema es instrumentar una máquina virtual con GDB y Python, como se muestra en una publicación anterior sobre Zeus P2P y Dyreza. Se deben utilizar dos puntos de interrupción: 1. Al principio de la función, por ejemplo justo después de la llamada a GetSystemTime (). Para inicializar los registros y la pila al estado relevante: ESI contiene la semilla EDI contiene el índice una variable apunta a una estructura SYSTEMTIME cuyos desplazamientos 0, 2 y 6 contienen el año, el mes y el día, respectivamente 2. Dejamos Pieza de malware se ejecuta hasta que alcanza un segundo punto de interrupción donde se ha generado el dominio correspondiente a estos parámetros. A continuación, se incrementa el índice y, sobrescribiendo unas pocas instrucciones, el programa vuelve al primer punto de interrupción para generar otro dominio. Si el índice llega a 8, se restablece y se incrementa el día. La siguiente secuencia de comandos GDB / Python implementa este método y genera automáticamente todos los dominios para abril y mayo de 2016: El resultado se almacena en dga0x4dmethod2gdb. txt. Como estamos ejecutando Locky en una máquina virtual completa, estos dominios son considerados como nuestra referencia. Let8217s los comparan con el resultado de nuestra implementación manual (método 1): Nuestra implementación manual parece correcta. Método 3: Sandbox fino El método anterior funciona perfectamente, pero para un malware simple como Locky, tal vez podamos encontrar algo más fácil de usar. Después de todo, ¿por qué deberíamos instrumentar todo un sistema operativo cuando solo necesitamos ejecutar unas instrucciones de montaje básicas? Miasm proporciona una caja de seguridad que soluciona este problema. El primer bloque llama memset () para restablecer la zona donde se va a generar el dominio, let8217s emular esto en Python con un segundo punto de interrupción: Miasm Ha creado una zona de memoria para la pila comenzando en la dirección 0x130000: Por ejemplo, configuramos EBP a 0x13f000: El dominio se generará en una dirección de memoria arbitraria y var40 debería apuntar a ella, como lo requiere el código DGA: Finalmente, Establecer la semilla, el índice y la fecha (IDA indica que el indicador de estructura SYSTEMTIME está desactivado por 0x24): La ejecución se iniciará desde la dirección justo después de la llamada a GetSystemTime (): IDA indica que la cadena TLD está en 0x413D5C ya ha sido Mapeado por el analizador Miasm PE como parte de la sección binaria. rdata: Si esta asignación hadn8217t se ha hecho automáticamente, podría haber sido añadido manualmente: La emulación genera correctamente el primer nombre de dominio para la fecha 2016/04/01: Después de casi El mismo esquema que el script GDB del método 2, el siguiente script genera los nombres de dominio para abril y mayo de 2016 con un sandbox Miasm: Los dominios generados de esta manera coinciden con nuestra referencia: Método 4: ejecución simbólica 4.1 Inicialización DGA En el método automatizado 2 Y 3, simplemente ejecutamos el código de Locky8217s sin tratar de entender su funcionamiento interno. Cuando el objetivo es volver a implementar el algoritmo es C o Python por ejemplo, estos métodos no son relevantes. Si la complejidad DGA hace imposible la transcripción manual (método 1), necesitamos una herramienta para generar automáticamente una versión de alto nivel del algoritmo a partir de sus instrucciones de montaje. Miasm tiene un ingeniero de ejecución simbólico para este propósito. Se comienza por desmontar el bloque inicializando Locky8217s DGA, entre direcciones 0x406d67 y 0x406dfa (ver método 1 para las 3 etapas del algoritmo): La ejecución se inicia en este primer bloque: En el código, podemos ver que se realizan varias operaciones en El registro EAX y que el valor resultante se almacena en var14 (EBP0xFFFFFFEC). La expresión puede parecer compleja a primera vista, pero todavía podemos reconocer las adiciones y las multiplicaciones con las constantes ya observadas para las rotaciones del método 1, de la izquierda (ltltlt) y de la derecha (gtgtgt) Así como el uso de varias variables de pila. Let8217s utilizan Miasm para simplificarlo. Podemos comenzar reemplazando los registros ESI y EDI por la semilla y el índice: También podemos reemplazar lecturas de la estructura SYSTEMTIME por identificadores más legibles: Estas son las mismas inicializaciones que las hechas con GDB y el sandbox delgado para los métodos 2 Y 3. Después de otra ejecución, obtenemos: La expresión se puede simplificar más reemplazando las constantes por c1. C2 y c3, utilizando el motor de simplificación Miasm: En cuanto a las variables de año y mes, proceden de campos de 16 bits dentro de una estructura SYSTEMTIME y se extienden a cero a 32 bits a través de las instrucciones movzx. En el lenguaje intermedio Miasm, esto corresponde a una expresión ExprCompose, señalada con llaves. Para hacerla más legible, simplifíquela al año. Y hacer lo mismo para el mes: Para la variable día, Locky utiliza la instrucción shrcx, 1, traducida por Miasm en una composición ecx1: 16 extendida de 32 bits. Con estas 6 simplificaciones básicas, obtenemos la siguiente expresión: La expresión asustadiza se ha convertido en un liner perfectamente legible. En las zonas de memoria alteradas, también observamos el restablecimiento de la variable var10: El bucle DGA termina comparando var10 con EBX calculado en este primer bloque: Reconocemos var14. Por lo que let8217s simplificar la expresión de var14 por un identificador var14 para hacerlo más legible: Esta expresión representa el tamaño de los nombres de dominio generados: 5 var140xB. En los registros alterados por este bloque inicial, el EDI se pone a 0x10: El primer bloque se puede resumir así: 4.2 Bucle DGA El bloque de inicialización se entiende, let8217s continúa con el bucle DGA. Su ejecución simbólica no llega al final del bloque: El motor de ejecución simbólico se detiene en el salto condicional basado en una comparación entre var2C y EDI y can8217t indica qué rama tomar. Sabemos que el EDI se fija en 0x10 por el anterior bloque let8217s obligan a la variable a cero ya que el salto no tiene impacto en el propio algoritmo: Let8217s también establece las variables vistas en el bloque anterior: Esta vez, la ejecución llega al final del Y se han alterado las siguientes áreas de memoria: var10. Se pone a cero en el bloque anterior, incrementado en 1 en el bucle y por lo tanto es un contador. Var14 se puede simplificar como se muestra anteriormente: En esta expresión, var10 es extendido a cero a 32 bits y puede ser simplificado: Obtenemos la siguiente expresión: El carácter generado por la DGA está presente en EDX al final del bucle: Reconocemos La expresión de var14 que nos lleva a la siguiente simplificación: Es simplemente 0x61 var1425. Con 0x61 ord (8216a8217). Este bucle puede resumirse así: 4.3 Extensión Este es el último bloque que queda. En 0x406e74, el registro EAX contiene el índice en la cadena TLD: EBPinit0xFFFFFFEC es var14 y puede ser simplificado: Ahora hemos generado todos los elementos de algoritmo requeridos en forma de expresiones Miasm: 4.4 Generación de código C Como el objetivo es traducir el algoritmo En C y Python, vamos a convertir estas expresiones Miasm a través de traductores. Por ejemplo, en la expresión de inicialización var14: Para el número de iteraciones: Notamos que la traducción C a veces utiliza funciones externas como rotleft (). Rotright (). Shiftrightlogic32 () o umod64 (). Estas funciones se implementan en miasm2 / jitter / vmmngr. . Al copiar el código C generado de esta manera por Miasm a partir de todas nuestras expresiones simplificadas, obtenemos el siguiente código: Let8217s lo prueba generando los dominios de abril y mayo de 2016: Miasm ha generado correctamente el algoritmo y su transcripción C es correcta. 4.5 Generación de código Python La conversión de nuestras expresiones a Python no es tan sencilla: Pero como la representación textual de nuestras expresiones está muy cerca de Python, vamos a generar código Python válido con la ayuda de algunas sustituciones de expresiones regulares. La expresión que representa var14 en el paso inicial es válida excepto para las rotaciones izquierda y derecha: Let8217s reemplazan la operación a ltltlt b por un identificador rol (a, b) y un gtgtgt b por ror (a, b) con el siguiente código: Al agregar esta función a la ingeniería Miasm simplificación, obtenemos código Python válido para var14: Lo mismo para la computación módulo: Este es también válido código Python y las otras expresiones se pueden convertir de la misma manera. El único paso a seguir es agregar llamadas a v32 () para garantizar la aritmética de 32 bits: Finalmente, var14 y nbloops tienen la siguiente expresión de Python: Solo tenemos que copiar / pegar todas estas expresiones de Python a un script: Let8217s prueba para abril Y mayo de 2016: Conclusión DGAs utilizados por el malware actual son generalmente simples y pueden ser fácilmente traducido a cualquier idioma por un ser humano. Pero si el algoritmo fuera más complejo que exceptuado o actualizado con frecuencia, puede ser útil automatizar esta tarea. A través de una máquina virtual clásica, GDB puede hacer el trabajo, pero si uno está buscando una solución ligera, el marco Miasm es muy útil. Su caja de arena puede emular código de cualquier binario y generar rápidamente los nombres de dominio, sin necesidad de entender todos los detalles de implementación de la DGA. Por el contrario, si el objetivo es reconstruir el algoritmo para implementarlo en otro lenguaje, el módulo de ejecución simbólica de Miasm puede generar expresiones en un lenguaje intermedio, correspondiente a registros modificados o áreas de memoria, que luego puede ser reducido con su motor de simplificación. La traducción en C o en Python puede realizarse directamente con el módulo Translator o mediante expresiones regulares, para obtener el algoritmo en sí en lugar del resultado de su ejecución. Compartir información sobre amenazas siempre ha sido, es, y seguirá siendo un gen dominante en el ADN de Lexsis. Con 15 años de actividad de inteligencia de amenazas y uno de los CERT privados más grandes de Europa, Lexsi trata de compartir información de seguridad con cualquier persona interesada: compañeros, socios, otros CERT, clientes y usted. Bienvenido a bordo El tipo de búsqueda secuencial es utilizado por todos los tipos de señal Plug-ins o Parsed (decodificado). Esto incluye todas las señales, excepto las señales booleanas y de bus (consulte: Definir búsquedas). Este tipo de búsqueda tiene un grupo de términos de búsqueda (o criterios) que es específico para el tipo de señal elegido, y puede realizar una secuencia de búsqueda añadiendo términos adicionales. Los términos se pueden agregar mediante los botones Copiar o Más. Al cambiar el modo (Campo o Marco) a Campos, puede orientar la búsqueda a coincidir secuencialmente mientras ignora los límites del marco. Para buscar una secuencia de múltiples tramas, cada una de las cuales tiene su propia coincidencia de secuencia de campo, seleccione el modo de trama. Si la información de trama no está presente en los datos, el Modo se limitará a Secuencias de campo. El número de términos de campo es ilimitado y cada término se etiqueta con caracteres ASCII. En la imagen de arriba, tres términos de campo son visibles (a b y c.). Uso del término a. Como ejemplo, cada opción se explica a continuación. Botón Pinzar - Identifica qué punto de la secuencia se marcará como el tiempo de coincidencia en los resultados de búsqueda. Cuando se selecciona, el pin de empuje aparecerá en azul, indicando que el marcador seleccionado para la búsqueda se colocará al principio de este término de coincidencia específico. Cuando no se selecciona, aparecerá blanco, lo que significa que se ha seleccionado otro término en la secuencia para la posición del marcador. Si todos los términos han sido desactivados, el primer término de la secuencia se seleccionará automáticamente para la posición del marcador. Skip and Skip Count - Saltar opciones son quotAny número de camposquot o quotSpecified número de camposquot. Cuando se establece en quotAny número de Fieldsquot, la búsqueda ignorará el recuento de saltos y continuará buscando el siguiente campo que coincida con los criterios. La búsqueda continuará hasta el final de los datos capturados si es necesario antes de informar un no coincidente. Sin embargo, cuando se establece en quotSpecified number of Fieldsquot, la búsqueda sólo ignorará (y omitirá) el número de campos especificados en el editor de recuento de saltos antes de buscar la próxima coincidencia. Si el siguiente término después de que el recuento de saltos no coincida, entonces la búsqueda informa que no hay coincidencia. Establecer el recuento de saltos a un valor de quot0quot indica a la búsqueda que analiza el siguiente campo en secuencia (No omitir). Campo - Algunos tipos de señal tendrán muchos identificadores de campo que se pueden utilizar para la búsqueda específica. La selección de campos se puede utilizar para elegir el tipo de campo específico que se desea buscar. Si el campo a considerar para la coincidencia no es el tipo especificado, el resultado es una coincidencia, incluso si el valor del campo coincide con el valor especificado. A continuación se muestran las opciones de selección de campo para el tipo de señal asíncrona incorporada. Valor a coincidir - Dependiendo del tipo de campo específico, se pueden especificar 1 o más valores para la coincidencia. Algunos campos no tienen valores adicionales, por lo que la búsqueda es una coincidencia si se encuentra el campo especificado (es decir, el error de paridad anterior). Otros campos pueden tener varios valores dentro del campo. Cada valor se hace referencia en los editores de valores con un quotquot anterior. Como se muestra arriba, el campo DATA tiene 1 valor, identificado por quot1quot. A continuación se muestra un ejemplo del editor para el campo DATA. El valor a buscar puede especificarse en formato Decimal, HEX, Binary o ASCII como se muestra a continuación. Un ejemplo de un Campo con más de 1 valor (del tipo de señal SPI): Botones - Los tres botones en la parte inferior izquierda de un término de campo son para borrar el término actual (-), añadiendo un nuevo término debajo del actual ) O crear y añadir un duplicado del término actual (Copiar). El modo de trama utiliza la misma lógica que el modo de campo, pero añade una capa adicional de agrupación si la información de trama está presente en los datos. El número de términos de fotograma no está limitado y cada fotograma se etiquetará numéricamente, comenzando con quot1quot. Skip and Skip Count - Los parámetros Omitir y Omitir cuenta se aplican a Marcos (un grupo de campos) en lugar de campos. La secuencia de coincidencia de campos dentro de cada trama está limitada a los campos delimitados por datos de trama del tipo de señal. No limitamos el número de términos de campo o saltos dentro de un marco. Sin embargo, si especifica una secuencia que implica un mayor número de campos que el número de campos disponibles en los datos enmarcados, la búsqueda fallará. Botones - En marcos, los botones Eliminar, Añadir y copiar se encuentran en la esquina superior derecha del término de marco y tienen las mismas funciones que las descritas para los campos, pero se aplican al marco. Si copia un fotograma, el nuevo fotograma será idéntico al fotocopiado, incluyendo todos los términos del campo y sus configuraciones individuales.

Comments