Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Dica de bug bounty: inscreva-se no Intigriti, uma plataforma premium de bug bounty 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!
De Binário Compilado para .pyc
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 ("compilado" python), você deve começar tentando extrair o código python original:
Certifique-se de que o binário tem a extensão ".pyc" (se não, o uncompyle6 não vai 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 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 .pyc file os seguintes bytes: 0x0d550a0d000000000000000000000000
Uma vez que você tenha adicionado esse cabeçalho mágico, o erro deve ser corrigido.
É assim que um cabeçalho mágico .pyc python3.8 corretamente adicionado deve parecer:
Erro: Decompilando erros genéricos
Outros erros como: class 'AssertionError'>; co_code deve ser um dos tipos (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); é do tipo <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 de 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 a um número de versão de bytecode Python ausente. Para resolver isso, uma opção de prepend foi adicionada, que anexa o número de versão de bytecode Python necessário, facilitando o processo de decompilação.
Exemplo do problema:
Analisando a montagem do python
Se você não conseguiu extrair o código "original" do python seguindo os passos anteriores, então você pode tentar extrair a montagem (mas não é muito descritivo, então tente extrair novamente o código original). Em aqui eu encontrei um código muito simples para desmontar o binário .pyc (boa sorte entendendo o fluxo do código). Se o .pyc for do python2, use python2:
Python para Executável
Para começar, vamos mostrar como os payloads podem ser compilados no py2exe e no PyInstaller.
Para criar um payload usando py2exe:
Instale o pacote py2exe de http://www.py2exe.org/
Para o payload (neste caso, vamos nomeá-lo de hello.py), use um script como o da Figura 1. A opção “bundle_files” com o valor de 1 irá agrupar tudo, incluindo o interpretador Python, em um único exe.
Uma vez que o script esteja pronto, emitiremos o comando “python setup.py py2exe”. Isso criará o executável, assim como na Figura 2.
Para criar um payload usando PyInstaller:
Instale o PyInstaller usando pip (pip install pyinstaller).
Depois disso, emitiremos o comando “pyinstaller –onefile hello.py” (um lembrete de que ‘hello.py’ é nosso payload). Isso irá agrupar tudo em um único executável.
Referências
Dica de bug bounty: inscreva-se na Intigriti, uma plataforma premium de bug bounty 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