Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Bug-Bounty-Tipp: Melde dich an bei Intigriti, einer Premium-Bug-Bounty-Plattform, die von Hackern für Hacker erstellt wurde! Schließe dich uns heute an unter https://go.intigriti.com/hacktricks und beginne, Belohnungen von bis zu $100.000 zu verdienen!
Von kompiliertem Binary zu .pyc
Von einem ELF kompilierten Binary kannst du die .pyc mit:
In einer python exe-Binärdatei können Sie die .pyc erhalten, indem Sie Folgendes ausführen:
Von .pyc zu Python-Code
Für die .pyc-Daten ("kompilierte" Python) sollten Sie versuchen, den ursprünglichen Python-Code zu extrahieren:
Stellen Sie sicher, dass die Binärdatei die Erweiterung ".pyc" hat (wenn nicht, wird uncompyle6 nicht funktionieren)
Beim Ausführen von uncompyle6 könnten Sie die folgenden Fehler feststellen:
Fehler: Unbekannte magische Zahl 227
Um dies zu beheben, müssen Sie die richtige Magic-Nummer am Anfang der generierten Datei hinzufügen.
Magic-Nummern variieren mit der Python-Version, um die Magic-Nummer von Python 3.8 zu erhalten, müssen Sie ein Python 3.8-Terminal öffnen und ausführen:
Die magic number in diesem Fall für python3.8 ist 0x550d0d0a
, dann müssen Sie, um diesen Fehler zu beheben, die folgenden Bytes am Anfang der .pyc-Datei hinzufügen: 0x0d550a0d000000000000000000000000
Sobald Sie diesen magic header hinzugefügt haben, sollte der Fehler behoben sein.
So sieht ein korrekt hinzugefügter .pyc python3.8 magic header aus:
Fehler: Decompiling generische Fehler
Andere Fehler wie: class 'AssertionError'>; co_code sollte einer der Typen sein (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); ist Typ <class 'NoneType'>
können auftreten.
Das bedeutet wahrscheinlich, dass Sie die magische Zahl nicht korrekt hinzugefügt haben oder dass Sie nicht die richtige magische Zahl verwendet haben, also stellen Sie sicher, dass Sie die richtige verwenden (oder versuchen Sie eine neue).
Überprüfen Sie die vorherige Fehlermeldungsdokumentation.
Automatisches Werkzeug
Das python-exe-unpacker Tool dient als Kombination mehrerer in der Community verfügbarer Werkzeuge, die Forschern helfen sollen, ausführbare Dateien, die in Python geschrieben wurden, insbesondere solche, die mit py2exe und pyinstaller erstellt wurden, zu entpacken und zu dekompilieren. Es enthält YARA-Regeln, um zu identifizieren, ob eine ausführbare Datei auf Python basiert, und bestätigt das Erstellungswerkzeug.
ImportError: Dateiname: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' existiert nicht
Ein häufiges Problem besteht darin, dass eine unvollständige Python-Bytecode-Datei aus dem Entpackungsprozess mit unpy2exe oder pyinstxtractor resultiert, die dann von uncompyle6 aufgrund einer fehlenden Python-Bytecode-Versionnummer nicht erkannt wird. Um dies zu beheben, wurde eine Voranstellungsoption hinzugefügt, die die erforderliche Python-Bytecode-Versionnummer anfügt und den Dekompilierungsprozess erleichtert.
Beispiel für das Problem:
Analyzing python assembly
Wenn es Ihnen nicht gelungen ist, den python "originalen" Code gemäß den vorherigen Schritten zu extrahieren, können Sie versuchen, die assembly zu extrahieren (aber es ist nicht sehr beschreibend, also versuchen Sie, den originalen Code noch einmal zu extrahieren). Hier hier habe ich einen sehr einfachen Code gefunden, um die .pyc Binärdatei zu disassemblieren (viel Glück beim Verstehen des Codeflusses). Wenn die .pyc von python2 ist, verwenden Sie python2:
Python zu Executable
Um zu beginnen, zeigen wir Ihnen, wie Payloads in py2exe und PyInstaller kompiliert werden können.
Um einen Payload mit py2exe zu erstellen:
Installieren Sie das py2exe-Paket von http://www.py2exe.org/
Für den Payload (in diesem Fall nennen wir ihn hello.py) verwenden Sie ein Skript wie das in Abbildung 1. Die Option “bundle_files” mit dem Wert 1 wird alles, einschließlich des Python-Interpreters, in eine exe bündeln.
Sobald das Skript bereit ist, geben wir den Befehl “python setup.py py2exe” ein. Dies wird die ausführbare Datei erstellen, genau wie in Abbildung 2.
Um ein Payload mit PyInstaller zu erstellen:
Installieren Sie PyInstaller mit pip (pip install pyinstaller).
Danach geben wir den Befehl “pyinstaller –onefile hello.py” ein (eine Erinnerung, dass ‘hello.py’ unser Payload ist). Dies wird alles in eine ausführbare Datei bündeln.
References
Bug bounty tip: Melden Sie sich an für Intigriti, eine Premium-Bug-Bounty-Plattform, die von Hackern für Hacker erstellt wurde! Treten Sie uns bei https://go.intigriti.com/hacktricks heute bei und beginnen Sie, Prämien von bis zu 100.000 $ zu verdienen!
Last updated