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

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

दूसरे तरीके HackTricks का समर्थन करने के लिए:

Bug bounty tip: Intigriti के लिए साइन अप करें, एक प्रीमियम बग बाउंटी प्लेटफॉर्म जो हैकर्स द्वारा बनाया गया है! आज ही हमारे साथ शामिल हों https://go.intigriti.com/hacktricks और शुरू करें बाउंटी कमाना तक $100,000 तक!

From Compiled Binary to .pyc

From an ELF compiled binary you can get the .pyc with:

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

Python exe binary में कंपाइल किए गए फ़ाइल में आप .pyc प्राप्त कर सकते हैं द्वारा चलाने:

python pyinstxtractor.py executable.exe

.pyc से पायथन कोड तक

.pyc डेटा ("कॉम्पाइल्ड" पायथन) के लिए आपको मूल पायथन कोड को निकालने की कोशिश करनी चाहिए:

uncompyle6 binary.pyc  > decompiled.py

सुनिश्चित करें कि बाइनरी का एक्सटेंशन ".pyc" है (अगर नहीं है, तो uncompyle6 काम नहीं करेगा)

uncompyle6 को निष्पादित करते समय आपको निम्नलिखित त्रुटियाँ मिल सकती हैं:

त्रुटि: अज्ञात मैजिक नंबर 227

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

इसे ठीक करने के लिए आपको उत्पन्न फ़ाइल की शुरुआत में सही मैजिक नंबर जोड़ने की आवश्यकता है।

मैजिक नंबर पायथन संस्करण के साथ भिन्न होते हैं, पायथन 3.8 का मैजिक नंबर प्राप्त करने के लिए आपको पायथन 3.8 टर्मिनल खोलने और निम्नलिखित को निष्पादित करने की आवश्यकता है:

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

इस मामले में पायथन3.8 के लिए मैजिक नंबर है 0x550d0d0a, तो, इस त्रुटि को ठीक करने के लिए आपको .pyc फ़ाइल की शुरुआत में निम्नलिखित बाइट्स जोड़ने की आवश्यकता होगी: 0x0d550a0d000000000000000000000000

एक बार जब आपने उस मैजिक हेडर को जोड़ दिया होगा, तो त्रुटि ठीक हो जानी चाहिए।

यह है कि कैसे एक सही ढंग से जोड़ा गया .pyc पायथन3.8 मैजिक हेडर दिखेगा:

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

त्रुटि: सामान्य त्रुटियाँ डिकॉम्पाइलिंग

अन्य त्रुटियाँ जैसे: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'> प्रकट हो सकती हैं।

यह संभावना है कि आपने सही रूप से मैजिक नंबर नहीं जोड़ा है या आपने सही मैजिक नंबर का उपयोग नहीं किया है, इसलिए सुनिश्चित करें कि आप सही उपयोग कर रहे हैं (या एक नया प्रयास करें)।

पिछली त्रुटि संदर्भ की जाँच करें।

स्वचालित उपकरण

python-exe-unpacker उपकरण कई सामुदायिक उपलब्ध उपकरणों का संयोजन के रूप में काम करता है जो शोधकों को सहायता प्रदान करने के लिए डिज़ाइन किए गए हैं जो पाइथन में लिखे गए क्रियाशील औपचारिकों को अनपैक और डिकॉम्पाइल करने में मदद करते हैं, विशेष रूप से जिन्हें py2exe और pyinstaller के साथ बनाया गया है। यह यारा नियमों को शामिल करता है ताकि पता लगाया जा सके कि क्या एक क्रियाशील पाइथन आधारित है और निर्माण उपकरण की पुष्टि करता है।

आयात त्रुटि: फ़ाइल नाम: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' मौजूद नहीं है

एक सामान्य समस्या जिसका सामना किया जाता है, वह एक अधूरी पाइथन बाइटकोड फ़ाइल से होता है जो unpy2exe या pyinstxtractor के साथ अनपैकिंग प्रक्रिया से परिणामित होता है, जिसके बाद uncompyle6 द्वारा पहचाना नहीं जा सकता है क्योंकि एक अभावित पाइथन बाइटकोड संस्करण संख्या होती है। इस समस्या का समाधान करने के लिए, एक प्रीपेंड विकल्प जोड़ा गया है, जो आवश्यक पाइथन बाइटकोड संस्करण संख्या को जोड़ता है, जिससे डिकॉम्पाइलिंग प्रक्रिया सुविधाजनक हो।

समस्या का उदाहरण:

# 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.

अनुलोम पायथन विधानसभा का विश्लेषण

यदि आप पिछले कदमों का पालन करके पायथन "मूल" कोड निकालने में सक्षम नहीं थे, तो आप असेंबली को निकालने का प्रयास कर सकते हैं (लेकिन यह विवरणात्मक नहीं है, इसलिए पुनः मूल कोड निकालने का प्रयास करें)। यहाँ इसमें मैंने एक बहुत ही सरल कोड पाया है जिससे .pyc बाइनरी को डिसएसेम्बल किया जा सकता है (कोड फ्लो को समझने के लिए शुभकामनाएं)। यदि .pyc पायथन2 से है, तो पायथन2 का उपयोग करें:

>>> 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 से Executable तक

शुरुआत के लिए, हम आपको दिखाएंगे कि payloads कैसे py2exe और PyInstaller में कॉम्पाइल किए जा सकते हैं।

py2exe का उपयोग करके payload बनाने के लिए:

  1. http://www.py2exe.org/ से py2exe पैकेज को इंस्टॉल करें।

  2. Payload के लिए (इस मामले में, हम इसे hello.py नाम देंगे), Figure 1 में दिए गए स्क्रिप्ट का उपयोग करें। विकल्प "bundle_files" जिसका मान 1 है, सभी चीजों को एक exe में बंडल करेगा, जिसमें Python interpreter भी शामिल होगा।

  3. एक बार स्क्रिप्ट तैयार हो जाए, हमें कमांड "python setup.py py2exe" जारी करनी होगी। यह executable बनाएगा, जैसे Figure 2 में दिखाया गया है।

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 का उपयोग करके payload बनाने के लिए:

  1. Pip का उपयोग करके PyInstaller को इंस्टॉल करें (pip install pyinstaller)।

  2. इसके बाद, हमें आदेश जारी करना होगा "pyinstaller --onefile hello.py" (ध्यान दें कि 'hello.py' हमारा payload है)। इससे सब कुछ एक executable में बंडल हो जाएगा।

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.

संदर्भ

बग बाउंटी टिप: Intigriti में साइन अप करें, एक प्रीमियम बग बाउंटी प्लेटफॉर्म जो हैकर्स द्वारा बनाया गया है! आज ही हमारे साथ जुड़ें https://go.intigriti.com/hacktricks और शुरू करें बाउंटी अप तक $100,000 तक कमाने की!

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated