
Shoggoth es un proyecto de código abierto basado en C++ y la biblioteca asmjit para el cifrado polimórfico de archivos shellcode, PE y COFF dados.
Shoggoth generará un archivo de salida que almacenará la carga útil y su cargador correspondiente en forma ofuscada. Dado que la salida es independiente de la posición, se puede ejecutar directamente como shellcode. Se descifra a sí mismo en tiempo de ejecución cuando se ejecuta la carga útil.Aparte de cifrado rutinas, Shoggoth también agrega instrucciones basura entre rutinas que no cambian nada.
Comencé este proyecto para estudiar diferentes métodos de generación dinámica de instrucciones, asamblea Práctica y detección de firmas. Planeo actualizar regularmente el repositorio con mis nuevos conocimientos.
característica
La funcionalidad actual se enumera a continuación:
- Solo para entrada x64
- Capacidad para fusionar PIC COFF Loader con archivos de entrada COFF o BOF
- Capacidad para fusionar el cargador PIC PE con archivos de entrada PE
- Transmitir cifrados usando el algoritmo RC4
- Cifrado en bloque con operación de generación aleatoria
- Generación de instrucciones basura
Proceso de implementación
El flujo de ejecución general de Shoggoth en los archivos de entrada se muestra en la siguiente figura. Puede observar este flujo con la configuración predeterminada.

Básicamente, Shoggoth primero fusiona el código shell del cargador precompilado en función del modo seleccionado (archivo COFF o PE) y el archivo de entrada. Luego agrega las múltiples instrucciones basura generadas a esta carga útil combinada. Los stubs que contienen el cargador, las instrucciones basura y la carga útil se cifran primero mediante el cifrado RC4 y luego se cifran con bloques generados aleatoriamente mediante la combinación de los descifradores correspondientes. Finalmente, agrega una instrucción basura al bloque de resultados.
generación de código de máquina
Si bien Shoggoth genera aleatoriamente talones basura o instrucciones para las rutinas de encriptación, utiliza AsmJit biblioteca.
AsmJit es una biblioteca ligera para la generación de código de máquina escrita en C++. Puede generar código de máquina para arquitecturas X86, X86_64 y AArch64, y admite instrucciones básicas y todas las extensiones recientes. AsmJit permite especificar códigos de operación, registros, operandos inmediatos, etiquetas de llamada e incrustar valores arbitrarios en cualquier desplazamiento dentro del código. Cuando use AsmJit para generar algunas instrucciones de ensamblaje, use el valor en el operando de ensamblaje para llamar a la función API correspondiente a la operación de ensamblaje requerida. ensamblador clase. Para cada llamada a la API, AsmJit guarda el código y la información de reubicación en su estructura CodeHolder interna. Después de llamar a todas las funciones API de las instrucciones de ensamblaje que se generarán, el código se puede copiar desde CodeHolder a la memoria con permiso ejecutable a través de su clase JitRuntime y reubicarse.
Mientras buscaba una biblioteca de generación de código, encontré AsmJit, que vi que muchos proyectos populares usaban ampliamente. Es por eso que decidí usarlo para mis necesidades. No sé si Shoggoth es el primer proyecto que lo usa en un contexto de equipo rojo, pero creo que puede informar implementaciones futuras.
Cargadores COFF y PE
Shoggoth se puede usar para encriptar un archivo PE y COFF dado, de modo que ambos se puedan ejecutar como shellcode gracias a un cargador independiente de posición precompilado.acabo de usar C a Shellcode Una forma de obtener versiones PIC de conocidos cargadores PE y COFF que he modificado para proyectos antiguos.Para la compilación, utilicé la fuente de Manejar Katz El proyecto es un dumper LSASS en formato PIC.
Básicamente, para obtener shellcode utilizando la técnica C to Shellcode, eliminé todas las variables globales en la fuente del cargador, almacené todas las cadenas en la pila y resolví API de Windows La dirección de la función se obtiene cargando y resolviendo la DLL necesaria en tiempo de ejecución. Después de eso, determiné el punto de entrada usando un script de enlace y compilé el código usando MinGW con varios indicadores de compilación. Extraje la sección .text del ejecutable resultante y obtuve el shellcode del cargador. Dado que el archivo ejecutable obtenido después de editar el código anterior no contiene ningún segmento que no sea el segmento .text, el código de este segmento se puede utilizar como independiente de la posición.
El código fuente de estos se puede ver y editar desde cargador de café y cargador Tabla de contenido.Las versiones compiladas de estas fuentes también están disponibles en talón Tabla de contenido. Ahora, si desea editar o cambiar estos cargadores, debe respetar la firma y reemplazar los archivos binarios precompilados del directorio stub.
Cifrado RC4
Shoggoth primero usa uno de los cifrados de flujo, el algoritmo RC4, para cifrar la carga útil que obtiene. Después de generar aleatoriamente la clave utilizada aquí, cifra la carga útil con esa clave.este descifrador Los stubs que descifran la carga útil en tiempo de ejecución se crean y ensamblan dinámicamente mediante AsmJit. Los registros utilizados en el stub se eligen aleatoriamente para cada muestra.
Me refiero a la de Nayuki. el código Se usa para implementar el algoritmo RC4 que uso en Shoggoth.
cifrado de bloque aleatorio
Después de realizar el primer cifrado, Shoggoth realiza un segundo cifrado utilizando un cifrado de bloque generado aleatoriamente. Con un segundo cifrado, cifra el descifrador RC4 y, opcionalmente, el código auxiliar, que contiene la carga útil, las instrucciones basura y el cargador cifrado con RC4. Divide el bloque a cifrar en bloques de 8 bytes y utiliza instrucciones generadas aleatoriamente para cada bloque. Estas instrucciones incluyen ADD, SUB, XOR, NOT, NEG, INC, DEC, ROL y ROR. Los operandos de estas instrucciones también se eligen al azar.
Generación de instrucciones basura
Lógica de instrucción de basura generada fuertemente inspirada en el asombroso Ege Balci SGN proyecto. Shoggoth puede seleccionar instrucciones basura basadas en omitir bytes aleatorios, instrucciones sin efectos secundarios, llamadas a funciones espurias e instrucciones con efectos secundarios pero conservando el valor inicial. Estas instrucciones se seleccionan aleatoriamente y se generan llamando a las funciones API correspondientes de la biblioteca AsmJit. Además, para aumentar el tamaño y diferentes combinaciones, estas funciones generadoras se llaman recursivamente.
En la primera versión de Shoggoth había muchos lugares para colocar comandos basura. Por ejemplo, podemos colocar instrucciones basura entre instrucciones de cifrado de bloques o instrucciones de cifrado RC4. Sin embargo, con fines de demostración, los dejé en la versión a continuación para evitar la complejidad adicional de generar la carga útil.
uso
Requerir
No compilé el proyecto principal. Es por eso que tienes que compilarlo tú mismo. Alternativamente, si desea editar el código fuente del cargador PE o del cargador COFF, debe tener MinGW instalado en su máquina para compilarlos con los Makefiles dados.
- estudio visual 2019+
- (Opcional) Compilador MinGW
parámetros de línea de comando
______ _ _
/ _____) | _ | |
( (____ | |__ ___ ____ ____ ___ _| |_| |__
\____ \| _ \ / _ \ / _ |/ _ |/ _ (_ _) _ \
_____) ) | | | |_| ( (_| ( (_| | |_| || |_| | | |
(______/|_| |_|\___/ \___ |\___ |\___/ \__)_| |_|
(_____(_____|
by @R0h1rr1m
"Tekeli-li! Tekeli-li!"
Usage of Shoggoth.exe:
-h | --help Show the help message.
-v | --verbose Enable more verbose output.
-i | --input Input path of payload to be encrypted. (Mandatory)
-o | --output
¿Qué significa shoggoth?

«Era una cosa monstruosa e indescriptible, más grande que cualquier tren subterráneo: una masa invisible de burbujas protoplásmicas, que se iluminaban débilmente a sí mismas, e innumerables ojos improvisados que se formaban y desaparecían en el frente lleno de túneles como pústulas verdes de luz, presionando hacia abajo sobre nosotros, aplastando al pingüino enloquecido, deslizándonos por el suelo reluciente, que y sus semejantes barren con saña toda la basura.” ~ HP Lovecraft, En las montañas de la locura”
Los Shoggoths son monstruos ficticios de los Mitos de Cthulhu. Estas criaturas se mencionan en el ciclo de sonetos de HP Lovecraft Yuggoth (1929-30) y luego se describen en detalle en su novela At the Mountains of Madness (1931). Son capaces de formar cualquier órgano o apéndice requerido para la tarea en cuestión, aunque su estado habitual es una masa de ojos, bocas y tentáculos que se retuercen.
Dado que estas criaturas son como una masa sensible de carne gelatinosa que se moldea a sí misma, sin una forma fija en la descripción de Lovecraft, pensé en darles el nombre de Herramienta de encriptación polimórfica. ? ? ?
Referirse a
por favor considera atención y apoyo Siempre estamos actualizados