Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Suggerimento per il bug bounty: iscriviti a Intigriti, una piattaforma premium per i bug bounty creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi e inizia a guadagnare taglie fino a $100,000!
Da Binario Compilato a .pyc
Da un binario compilato ELF puoi ottenere il .pyc con:
In un eseguibile binario python puoi ottenere il file .pyc eseguendo:
Da .pyc a codice Python
Per i dati .pyc ("compilati" python) dovresti iniziare provando a estrarre il codice Python originale:
Assicurati che il file binario abbia l'estensione ".pyc" (altrimenti uncompyle6 non funzionerà)
Durante l'esecuzione di uncompyle6 potresti incontrare i seguenti errori:
Errore: Numero magico sconosciuto 227
Per risolvere questo problema è necessario aggiungere il numero magico corretto all'inizio del file generato.
I numeri magici variano con la versione di Python, per ottenere il numero magico di Python 3.8 sarà necessario aprire un terminale Python 3.8 ed eseguire:
Il numero magico in questo caso per python3.8 è 0x550d0d0a
, quindi, per correggere questo errore dovrai aggiungere all'inizio del file .pyc i seguenti byte: 0x0d550a0d000000000000000000000000
Una volta che avrai aggiunto quell'intestazione magica, l'errore dovrebbe essere corretto.
Ecco come apparirà correttamente aggiunta l'intestazione magica .pyc python3.8:
Errore: Errori generici nella decompilazione
Altri errori come: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>
potrebbero apparire.
Questo probabilmente significa che non hai aggiunto correttamente il numero magico o che non hai utilizzato il numero magico corretto, quindi assicurati di utilizzare quello corretto (o prova con uno nuovo).
Controlla la documentazione sull'errore precedente.
Strumento Automatico
Il strumento python-exe-unpacker funge da combinazione di diversi strumenti disponibili nella comunità progettati per assistere i ricercatori nel disimballaggio e nella decompilazione di eseguibili scritti in Python, in particolare quelli creati con py2exe e pyinstaller. Include regole YARA per identificare se un eseguibile è basato su Python e conferma lo strumento di creazione.
ImportError: Nome file: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' non esiste
Un problema comune riscontrato coinvolge un file bytecode Python incompleto risultante dal processo di disimballaggio con unpy2exe o pyinstxtractor, che quindi non viene riconosciuto da uncompyle6 a causa dell'assenza del numero di versione del bytecode Python. Per affrontare questo problema, è stata aggiunta un'opzione di prepend, che aggiunge il numero di versione del bytecode Python necessario, facilitando il processo di decompilazione.
Esempio del problema:
Analisi dell'assembly di Python
Se non sei riuscito a estrarre il codice "originale" di Python seguendo i passaggi precedenti, puoi provare a estrarre l'assembly (ma non è molto descrittivo, quindi prova a estrarre di nuovo il codice originale). In questo link ho trovato un codice molto semplice per disassemblare il binario .pyc (buona fortuna a capire il flusso del codice). Se il .pyc è di Python2, utilizza Python2:
Python a Eseguibile
Per iniziare, ti mostreremo come i payload possono essere compilati in py2exe e PyInstaller.
Per creare un payload usando py2exe:
Installa il pacchetto py2exe da http://www.py2exe.org/
Per il payload (in questo caso, lo chiameremo hello.py), utilizza uno script come quello nella Figura 1. L'opzione "bundle_files" con il valore 1 includerà tutto, compreso l'interprete Python, in un unico exe.
Una volta che lo script è pronto, emetteremo il comando "python setup.py py2exe". Questo creerà l'eseguibile, proprio come nella Figura 2.
Per creare un payload utilizzando PyInstaller:
Installa PyInstaller utilizzando pip (pip install pyinstaller).
Successivamente, emetteremo il comando "pyinstaller --onefile hello.py" (un promemoria che 'hello.py' è il nostro payload). Questo raggrupperà tutto in un eseguibile.
Riferimenti
Suggerimento per la caccia al bug: iscriviti a Intigriti, una piattaforma premium per la caccia ai bug creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi e inizia a guadagnare taglie fino a $100,000!
Last updated