Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Dica de recompensa por bugs: inscreva-se no Intigriti, uma plataforma premium de recompensa por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100.000!
Do Binário Compilado para .pyc
A partir de um binário compilado ELF, você pode obter o .pyc com:
Em um binário exe python compilado, você pode obter o .pyc executando:
De .pyc para código Python
Para os dados .pyc (python "compilado") você deve começar tentando extrair o código Python original:
Certifique-se de que o binário tenha a extensão ".pyc" (caso contrário, o uncompyle6 não funcionará)
Ao executar o uncompyle6, você pode encontrar os seguintes erros:
Erro: Número mágico desconhecido 227
Para corrigir isso, você precisa adicionar o número mágico correto no início do arquivo gerado.
Os números mágicos variam com a versão do Python, para obter o número mágico do Python 3.8 você precisará abrir um terminal do Python 3.8 e executar:
O número mágico neste caso para python3.8 é 0x550d0d0a
, então, para corrigir esse erro, você precisará adicionar no início do arquivo .pyc os seguintes bytes: 0x0d550a0d000000000000000000000000
Depois de ter adicionado esse cabeçalho mágico, o erro deve ser corrigido.
Assim é como um cabeçalho mágico .pyc python3.8 corretamente adicionado irá parecer:
Erro: Decompilando erros genéricos
Outros erros como: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>
podem aparecer.
Isso provavelmente significa que você não adicionou corretamente o número mágico ou que você não usou o número mágico correto, então certifique-se de usar o correto (ou tente um novo).
Verifique a documentação do erro anterior.
Ferramenta Automática
A ferramenta python-exe-unpacker serve como uma combinação de várias ferramentas disponíveis na comunidade, projetadas para ajudar pesquisadores a desempacotar e decompilar executáveis escritos em Python, especificamente aqueles criados com py2exe e pyinstaller. Inclui regras YARA para identificar se um executável é baseado em Python e confirma a ferramenta de criação.
ImportError: Nome do arquivo: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' não existe
Um problema comum encontrado envolve um arquivo de bytecode Python incompleto resultante do processo de desempacotamento com unpy2exe ou pyinstxtractor, que então não é reconhecido pelo uncompyle6 devido à ausência do número de versão do bytecode Python. Para resolver isso, uma opção de prefixo foi adicionada, que anexa o número de versão do bytecode Python necessário, facilitando o processo de decompilação.
Exemplo do problema:
Analisando o assembly do Python
Se você não conseguiu extrair o código "original" do Python seguindo os passos anteriores, então você pode tentar extrair o assembly (mas não é muito descritivo, então tente extrair novamente o código original). Aqui eu encontrei um código muito simples para desmontar o binário .pyc (boa sorte para entender o fluxo do código). Se o .pyc for do Python 2, use o python2:
Python para Executável
Para começar, vamos mostrar como os payloads podem ser compilados no py2exe e PyInstaller.
Para criar um payload usando py2exe:
Instale o pacote py2exe em http://www.py2exe.org/
Para o payload (neste caso, vamos chamá-lo de hello.py), use um script como o da Figura 1. A opção "bundle_files" com o valor 1 irá agrupar tudo, incluindo o interpretador Python, em um único executável.
Uma vez que o script estiver pronto, emitiremos o comando "python setup.py py2exe". Isso criará o executável, assim como na Figura 2.
Para criar um payload usando o PyInstaller:
Instale o PyInstaller usando o pip (pip install pyinstaller).
Em seguida, emitiremos o comando “pyinstaller –onefile hello.py” (lembrando que ‘hello.py’ é nosso payload). Isso irá agrupar tudo em um executável.
Referências
Dica de recompensa por bugs: cadastre-se no Intigriti, uma plataforma premium de recompensas por bugs criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!
Last updated