Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Suggerimento bug bounty: iscriviti a Intigriti, una premium piattaforma di bug bounty creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi, e inizia a guadagnare ricompense fino a $100,000!
Da binario compilato a .pyc
Da un binario compilato ELF puoi ottenere il .pyc con:
In un eseguibile binario python compilato puoi ottenere il .pyc eseguendo:
Da .pyc a codice python
Per i dati .pyc ("compilato" python) dovresti iniziare a provare a estrarre il codice python originale:
Assicurati che il file binario abbia l'estensione ".pyc" (in caso contrario, uncompyle6 non funzionerà)
Durante l'esecuzione di uncompyle6 potresti trovare 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 è necessario aprire un terminale python 3.8 ed eseguire:
Il numero magico in questo caso per python3.8 è 0x550d0d0a
, quindi, per risolvere questo errore dovrai aggiungere all'inizio del file .pyc i seguenti byte: 0x0d550a0d000000000000000000000000
Una volta che hai aggiunto quell'intestazione magica, l'errore dovrebbe essere risolto.
Ecco come apparirà correttamente un'intestazione magica .pyc python3.8 aggiunta:
Errore: Decompilazione errori generici
Altri errori come: class 'AssertionError'>; co_code dovrebbe essere uno dei tipi (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); è di tipo <class 'NoneType'>
possono 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 uno nuovo).
Controlla la documentazione degli errori precedenti.
Strumento Automatico
Il tool python-exe-unpacker funge da combinazione di diversi strumenti disponibili nella comunità progettati per assistere i ricercatori nello smontaggio e nella decompilazione di eseguibili scritti in Python, specificamente 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 riguarda un file di bytecode Python incompleto risultante dal processo di smontaggio con unpy2exe o pyinstxtractor, che poi non viene riconosciuto da uncompyle6 a causa di un numero di versione di bytecode Python mancante. Per affrontare questo problema, è stata aggiunta un'opzione di prepending, che aggiunge il numero di versione di bytecode Python necessario, facilitando il processo di decompilazione.
Esempio del problema:
Analizzando l'assembly di python
Se non sei riuscito a estrarre il codice "originale" di python seguendo i passaggi precedenti, allora puoi provare a estrarre l'assembly (ma non è molto descrittivo, quindi prova a estrarre di nuovo il codice originale). In qui ho trovato un codice molto semplice per disassemblare il binario .pyc (buona fortuna a capire il flusso del codice). Se il .pyc è di python2, usa python2:
Python in Eseguibile
Per iniziare, ti mostreremo come i payload possono essere compilati in py2exe e PyInstaller.
Per creare un payload utilizzando py2exe:
Installa il pacchetto py2exe da http://www.py2exe.org/
Per il payload (in questo caso, lo chiameremo hello.py), utilizza uno script simile a quello nella Figura 1. L'opzione “bundle_files” con il valore di 1 raggrupperà tutto, incluso 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 usando pip (pip install pyinstaller).
Dopo di che, emetteremo il comando “pyinstaller –onefile hello.py” (un promemoria che ‘hello.py’ è il nostro payload). Questo raggrupperà tutto in un unico eseguibile.
Riferimenti
Suggerimento per il bug bounty: iscriviti a Intigriti, una premium bug bounty platform creata da hacker, per hacker! Unisciti a noi su https://go.intigriti.com/hacktricks oggi, e inizia a guadagnare bounty fino a $100,000!
Last updated