Decompile compiled python binaries (exe, elf) - Retreive from .pyc

AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Hata ödülü ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium hata ödülü platformu! Bugün bize katılın https://go.intigriti.com/hacktricks ve $100,000'a kadar ödüller kazanmaya başlayın!

Derlenmiş İkili Dosyadan .pyc'ye

Bir ELF derlenmiş ikili dosyasından .pyc'yi alabilirsiniz:

pyi-archive_viewer <binary>
# The list of python modules will be given here:
[(0, 230, 311, 1, 'm', 'struct'),
(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'),
(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'),
(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'),
(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'),
(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'),
(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'),
(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'),
(15090, 445, 672, 1, 's', 'pyi_rth_inspect'),
(15535, 2514, 4421, 1, 's', 'binary_name'),
...

? X binary_name
to filename? /tmp/binary.pyc

Bir python exe binary derlenmiş dosyasında, .pyc dosyasını çalıştırarak elde edebilirsiniz:

python pyinstxtractor.py executable.exe

.pyc'den python koduna

.pyc verileri ("derlenmiş" python) için orijinal python kodunu çıkarmaya çalışmalısınız:

uncompyle6 binary.pyc  > decompiled.py

Binary'ın uzantısının ".pyc" olduğundan emin olun (değilse, uncompyle6 çalışmayacaktır)

uncompyle6 çalıştırılırken aşağıdaki hataları bulabilirsiniz:

Hata: Bilinmeyen sihirli numara 227

/kali/.local/bin/uncompyle6 /tmp/binary.pyc
Unknown magic number 227 in /tmp/binary.pyc

Bu sorunu düzeltmek için oluşturulan dosyanın başına doğru sihirli numarayı eklemeniz gerekir.

Sihirli numaralar python sürümüne göre değişir, python 3.8'in sihirli numarasını almak için bir python 3.8 terminali açmanız ve şunu çalıştırmanız gerekecek:

>> import imp
>> imp.get_magic().hex()
'550d0d0a'

Bu durumda python3.8 için sihirli sayı 0x550d0d0a olacaktır, ardından, bu hatayı düzeltmek için .pyc dosyasının başına şu baytları eklemeniz gerekecek: 0x0d550a0d000000000000000000000000

O sihirli başlığı ekledikten sonra, hata düzeltilmiş olmalıdır.

İşte doğru bir şekilde eklenmiş .pyc python3.8 sihirli başlığının görünümü:

hexdump 'binary.pyc' | head
0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000
0000010 00e3 0000 0000 0000 0000 0000 0000 0000
0000020 0700 0000 4000 0000 7300 0132 0000 0064
0000030 0164 006c 005a 0064 0164 016c 015a 0064

Hata: Genel hataların dekompilasyonu

Diğer hatalar şuna benzer olabilir: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>.

Bu muhtemelen, sihirli numarayı doğru bir şekilde eklememiş olmanızdan kaynaklanıyor ya da doğru sihirli numarayı kullanmadığınız anlamına geliyor, bu yüzden doğru olanı kullandığınızdan emin olun (ya da yeni bir tane deneyin).

Önceki hata belgelerini kontrol edin.

Otomatik Araç

python-exe-unpacker aracı, Python ile yazılmış yürütülebilir dosyaları açma ve dekompilasyon araçlarından oluşan topluluk tarafından sunulan birkaç aracın birleşimi olarak araştırmacılara yardımcı olmak üzere tasarlanmıştır, özellikle py2exe ve pyinstaller ile oluşturulanlar. Bu, bir yürütülebilir dosyanın Python tabanlı olup olmadığını tanımlamak için YARA kurallarını içerir ve oluşturma aracını doğrular.

ImportError: Dosya adı: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' mevcut değil

Karşılaşılan yaygın bir sorun, unpy2exe veya pyinstxtractor ile açma işleminden kaynaklanan eksik bir Python bayt kodu dosyasıdır, bu da ardından uncompyle6 tarafından eksik bir Python bayt kodu sürüm numarası nedeniyle tanınmaz. Bu sorunu çözmek için, gerekli Python bayt kodu sürüm numarasını ekleyen bir ön ek seçeneği eklenmiştir, bu da dekompilasyon işlemini kolaylaştırır.

Sorunun örneği:

# Error when attempting to decompile without the prepend option
test@test: uncompyle6 unpacked/malware_3.exe/archive.py
Traceback (most recent call last):
...
ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist
# Successful decompilation after using the prepend option
test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive
[*] On Python 2.7
[+] Magic bytes are already appended.

# Successfully decompiled file
[+] Successfully decompiled.

Python derlemesini analiz etme

Eğer önceki adımları takip ederek python "orijinal" kodu çıkartamadıysanız, o zaman derlemeyi çıkarmayı deneyebilirsiniz (ancak çok açıklayıcı değil, bu yüzden tekrar orijinal kodu çıkarmayı deneyin). Burada çok basit bir kod buldum .pyc ikili dosyasını çözümlemek için (kod akışını anlamak için iyi şanslar). .pyc python2'den ise, python2 kullanın:

>>> import dis
>>> import marshal
>>> import struct
>>> import imp
>>>
>>> with open('hello.pyc', 'r') as f:  # Read the binary file
...     magic = f.read(4)
...     timestamp = f.read(4)
...     code = f.read()
...
>>>
>>> # Unpack the structured content and un-marshal the code
>>> magic = struct.unpack('<H', magic[:2])
>>> timestamp = struct.unpack('<I', timestamp)
>>> code = marshal.loads(code)
>>> magic, timestamp, code
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
>>>
>>> # Verify if the magic number corresponds with the current python version
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
True
>>>
>>> # Disassemble the code object
>>> dis.disassemble(code)
1           0 LOAD_CONST               0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
3 MAKE_FUNCTION            0
6 STORE_NAME               0 (hello_world)
9 LOAD_CONST               1 (None)
12 RETURN_VALUE
>>>
>>> # Also disassemble that const being loaded (our function)
>>> dis.disassemble(code.co_consts[0])
2           0 LOAD_CONST               1 ('Hello  {0}')
3 LOAD_ATTR                0 (format)
6 LOAD_FAST                0 (name)
9 CALL_FUNCTION            1
12 PRINT_ITEM
13 PRINT_NEWLINE
14 LOAD_CONST               0 (None)
17 RETURN_VALUE

Python'dan Yürütülebilir Dosyaya

Başlamak için, size yüklerin py2exe ve PyInstaller ile derlenebileceğini göstereceğiz.

py2exe kullanarak bir yük oluşturmak için:

  1. http://www.py2exe.org/ adresinden py2exe paketini yükleyin.

  2. Yük için (bu durumda, ona hello.py adını vereceğiz), Şekil 1'deki gibi bir betik kullanın. "bundle_files" seçeneği, 1 değeriyle, Python yorumlayıcısını da içeren her şeyi bir exe dosyasına paketleyecektir.

  3. Betik hazır olduğunda, "python setup.py py2exe" komutunu veririz. Bu, Şekil 2'deki gibi yürütülebilir dosyayı oluşturacaktır.

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
options = {'py2exe': {'bundle_files': 1}},
#windows = [{'script': "hello.py"}],
console = [{'script': "hello.py"}],
zipfile = None,
)
C:\Users\test\Desktop\test>python setup.py py2exe
running py2exe
*** searching for required modules ***
*** parsing results ***
*** finding dlls needed ***
*** create binaries ***
*** byte compile python files ***
*** copy extensions ***
*** copy dlls ***
copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe
Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe

PyInstaller kullanarak bir yük oluşturmak için:

  1. PyInstaller'ı pip kullanarak yükleyin (pip install pyinstaller).

  2. Bundan sonra, "pyinstaller --onefile hello.py" komutunu vereceğiz (hatırlatma: 'hello.py' yükümüzdür). Bu, her şeyi tek bir yürütülebilir dosyaya paketleyecektir.

C:\Users\test\Desktop\test>pyinstaller --onefile hello.py
108 INFO: PyInstaller: 3.3.1
108 INFO: Python: 2.7.14
108 INFO: Platform: Windows-10-10.0.16299
………………………………
5967 INFO: checking EXE
5967 INFO: Building EXE because out00-EXE.toc is non existent
5982 INFO: Building EXE from out00-EXE.toc
5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe
6325 INFO: Building EXE from out00-EXE.toc completed successfully.

Referanslar

Hata ödülü ipucu: Intigriti'ye kaydolun, hackerlar tarafından oluşturulan bir premium hata ödülü platformu! Bugün bize katılın https://go.intigriti.com/hacktricks ve 100.000 $'a kadar ödüller kazanmaya başlayın!

Sıfırdan kahraman olana kadar AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated