Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Consejo de recompensa por errores: Regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy y comienza a ganar recompensas de hasta $100,000!
Desde Binario Compilado a .pyc
Desde un binario compilado ELF puedes obtener el .pyc con:
En un binario exe de Python compilado puedes obtener el .pyc ejecutando:
De .pyc a código de Python
Para los datos de .pyc ("compilados" de Python) debes comenzar intentando extraer el código de Python original:
Asegúrate de que el binario tenga la extensión ".pyc" (de lo contrario, uncompyle6 no funcionará)
Al ejecutar uncompyle6 podrías encontrar los siguientes errores:
Error: Número mágico desconocido 227
Para solucionar esto, necesitas agregar el número mágico correcto al principio del archivo generado.
Los números mágicos varían con la versión de Python, para obtener el número mágico de Python 3.8 necesitarás abrir un terminal de Python 3.8 y ejecutar:
El número mágico en este caso para python3.8 es 0x550d0d0a
, luego, para corregir este error necesitarás agregar al principio del archivo .pyc los siguientes bytes: 0x0d550a0d000000000000000000000000
Una vez que hayas agregado ese encabezado mágico, el error debería estar corregido.
Así es como se verá un encabezado mágico .pyc de python3.8 correctamente agregado:
Error: Errores de decompilación genéricos
Otros errores como: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>
pueden aparecer.
Esto probablemente significa que no has añadido correctamente el número mágico o que no has utilizado el número mágico correcto, así que asegúrate de usar el correcto (o intenta con uno nuevo).
Verifica la documentación del error anterior.
Herramienta Automática
La herramienta python-exe-unpacker sirve como una combinación de varias herramientas disponibles en la comunidad diseñadas para ayudar a los investigadores a desempaquetar y decompilar ejecutables escritos en Python, específicamente aquellos creados con py2exe y pyinstaller. Incluye reglas YARA para identificar si un ejecutable está basado en Python y confirma la herramienta de creación.
ImportError: Nombre del archivo: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' no existe
Un problema común encontrado implica un archivo de bytecode de Python incompleto resultante del proceso de desempaquetado con unpy2exe o pyinstxtractor, que luego no es reconocido por uncompyle6 debido a la falta de un número de versión de bytecode de Python. Para abordar esto, se ha añadido una opción de prepend, que añade el número de versión de bytecode de Python necesario, facilitando el proceso de decompilación.
Ejemplo del problema:
Analizando el ensamblado de Python
Si no pudiste extraer el código "original" de Python siguiendo los pasos anteriores, entonces puedes intentar extraer el ensamblado (pero no es muy descriptivo, así que intenta extraer nuevamente el código original). En aquí encontré un código muy simple para desensamblar el binario .pyc (buena suerte entendiendo el flujo del código). Si el .pyc es de Python2, utiliza python2:
Python a Ejecutable
Para empezar, vamos a mostrarte cómo los payloads pueden ser compilados en py2exe y PyInstaller.
Para crear un payload usando py2exe:
Instala el paquete py2exe desde http://www.py2exe.org/
Para el payload (en este caso, lo nombraremos hello.py), utiliza un script como el que se muestra en la Figura 1. La opción "bundle_files" con el valor de 1 empaquetará todo, incluido el intérprete de Python, en un solo ejecutable.
Una vez que el script esté listo, emitiremos el comando "python setup.py py2exe". Esto creará el ejecutable, tal como se muestra en la Figura 2.
Para crear un payload usando PyInstaller:
Instalar PyInstaller usando pip (pip install pyinstaller).
Después de eso, emitiremos el comando "pyinstaller --onefile hello.py" (un recordatorio de que 'hello.py' es nuestro payload). Esto empaquetará todo en un ejecutable.
Referencias
Consejo de recompensa por errores: ¡Regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers! Únete a nosotros en https://go.intigriti.com/hacktricks hoy, ¡y comienza a ganar recompensas de hasta $100,000!
Última actualización