SHGenOB: Generador de Shellcode a partir de Código C PIC
Introducción
SHGenOB es una herramienta basada en Python diseñada para generar shellcode a partir de Código Independiente de Posición (PIC) escrito en C. Automatiza el proceso de compilar código C, extraer la sección .text y, opcionalmente, cifrar el shellcode resultante mediante cifrado XOR.
Este proyecto se basa enteramente en este de hasherezade.
Código Independiente de Posición (PIC)
Nota importante para los usuarios de SHGenOB: Para que esta herramienta de generación de shellcode funcione correctamente, el código C del archivo de entrada debe estar escrito como Código Independiente de Posición (PIC). La herramienta asume que el código proporcionado cumple con los principios y características de PIC que se describen a continuación.
El Código Independiente de Posición (PIC) es un tipo de código máquina que puede ejecutarse independientemente de su dirección de memoria absoluta. Esta característica hace que el PIC sea especialmente útil para crear shellcode, bibliotecas compartidas y ciertos tipos de malware. Las características clave del PIC incluyen:
- Independencia de dirección: El PIC puede ejecutarse correctamente sin importar dónde esté cargado en memoria.
- Sin referencias de memoria fijas: Evita el uso de direcciones absolutas, basándose en su lugar en direccionamiento relativo u otras técnicas para referenciar ubicaciones de memoria.
- Autocontenido: El PIC generalmente incluye todos los datos necesarios dentro del propio código, reduciendo las dependencias externas.
- Cadenas en la pila (Stack-Strings): Declarar cadenas como un array de caracteres obliga al compilador a colocarlas en la pila y no en la sección .data o .pdata del archivo PE.
- Sin reubicaciones: No requiere que el cargador realice reubicaciones, lo que hace que sea más rápido de cargar y ejecutar.
- Menor tamaño: El PIC suele dar como resultado binarios de menor tamaño en comparación con el código dependiente de la posición.
- Direccionamiento relativo a registros: Con frecuencia utiliza direccionamiento relativo a registros para acceder a los datos y realizar saltos.
- Uso de desplazamientos: En lugar de direcciones absolutas, el PIC utiliza desplazamientos desde el puntero de instrucción actual.
- Técnicas específicas de plataforma: Diferentes arquitecturas de CPU pueden requerir diferentes técnicas para lograr la independencia de posición.
El PIC es esencial en escenarios donde la dirección exacta de carga del código no se conoce de antemano, lo que lo convierte en un concepto crucial en el desarrollo de shellcode y en ciertas áreas de la programación de sistemas. Al usar SHGenOB, asegúrate de que tu código C de entrada siga estos principios PIC para generar shellcode eficaz y fiable.
Características
- Compila código C PIC utilizando las herramientas de Microsoft Visual Studio
- Extrae la sección .text del ejecutable compilado
- Cifra opcionalmente el shellcode mediante cifrado XOR
- Inserta el shellcode generado en una plantilla de loader
- Compila y prueba el loader con el shellcode generado
- Admite el modo de depuración para inspeccionar archivos intermedios
- Limpia los archivos intermedios tras una ejecución exitosa
Requisitos
- Sistema operativo Windows
- Python 3.6 o superior
- Microsoft Visual Studio 2022 Community Edition (o versión compatible)
- Los siguientes paquetes de Python:
- Un compilador de C (cl.exe) y un ensamblador (ml64.exe) de Visual Studio
- El archivo vcvars64.bat de Visual Studio (para configurar el entorno de compilación)
Instalación
- Instala Python 3.6 o superior desde python.org
- Instala Microsoft Visual Studio 2022 Community Edition
- Instala los paquetes de Python necesarios:
pip install pefile argparse
- Clona o descarga este repositorio en tu máquina local
Uso
Ejecuta el script desde la línea de comandos con la siguiente sintaxis:
python shgenob.py --code-file <path_to_c_file> [--masm-file <path_to_masm_file>] [--debug] [--xor-key <key>]
Argumentos:
--code-file o -cf: (Obligatorio) Ruta al archivo main.c que contiene el código PIC
--masm-file o -mf: (Opcional) Ruta al archivo .masm externo para incluir lógica adicional en ensamblador dentro del shellcode
--debug o -d: (Opcional) Habilita el modo de depuración (omite la limpieza de archivos intermedios)
--xor-key o -xk: (Opcional) Clave XOR para cifrar el shellcode (formato: AA,BB,CC)
Ejemplos:
# Basic usage
python shgenob.py --code-file main.c
# With external MASM file
python shgenob.py --code-file main.c --masm-file custom_logic.masm
# With all options
python shgenob.py --code-file main.c --masm-file custom_logic.masm --debug --xor-key AA,BB,CC
Descripciones de funciones
save_to_file(content, filename): Guarda el contenido proporcionado en un archivo en el directorio actual
cleanup(): Elimina los archivos intermedios (.asm, .exe, .obj, .lnk) del directorio actual
xor_encrypt(shellcode, key): Cifra el shellcode mediante XOR con la clave proporcionada
insert_shellcode_into_loader(formatted_shellcode, loader_file): Inserta el shellcode en la plantilla del loader
extract_text_section(file_path, key): Extrae la sección .text de un archivo PE y, opcionalmente, la cifra
find_file(root_dir, file_name): Busca un archivo en el directorio indicado y sus subdirectorios
run_command_with_vcvars(command, vcvars_path): Ejecuta un comando con las variables de entorno de Visual Studio configuradas
compile_cpp_file(cpp_file, vcvars_path, output_exe): Compila un archivo C++ usando el compilador de Visual Studio
modify_asm_file(asm_file): Modifica el archivo ensamblador generado para la compatibilidad con shellcode
main(cpp_file, args): Función principal que orquesta el proceso de generación de shellcode
Flujo de trabajo
- Analizar los argumentos de la línea de comandos
- Localizar las herramientas de Visual Studio (vcvars64.bat, cl.exe, ml64.exe)
- Compilar el archivo C de entrada a ensamblador
- Modificar el archivo ensamblador generado
- Ensamblar el archivo ensamblador modificado
- Extraer la sección .text del ejecutable resultante
- Cifrar opcionalmente el shellcode extraído
- Guardar el shellcode en un archivo
- Insertar el shellcode en una plantilla de loader
- Compilar el loader
- Probar el loader con el shellcode generado
- Limpiar los archivos intermedios (salvo en modo de depuración)
Depuración
Usa el indicador --debug para omitir el proceso de limpieza e inspeccionar los archivos intermedios. Esto es útil para solucionar problemas y comprender el proceso de generación de shellcode.
Consideraciones de seguridad
- Esta herramienta está destinada únicamente a fines educativos y de pruebas autorizadas
- El shellcode generado puede ser marcado por el software antivirus
- Utiliza cifrado (clave XOR) para ofuscar el shellcode, pero ten en cuenta que es una forma básica de ofuscación
- Asegúrate de tener permiso para usar esta herramienta en los sistemas objetivo
Limitaciones
- Actualmente solo admite Windows y la cadena de herramientas de Microsoft Visual Studio
- Manejo limitado de errores para algunos casos extremos
- El cifrado XOR es una forma básica de ofuscación y puede no ser suficiente para todos los casos de uso
Contribuciones
Las contribuciones para mejorar SHGenOB son bienvenidas. Por favor, sigue estos pasos:
- Haz un fork del repositorio
- Crea una nueva rama para tu función
- Haz commit de tus cambios
- Sube los cambios a la rama
- Crea un nuevo Pull Request