Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
Από Συγκεντρωμένο Δυαδικό σε .pyc
Από ένα ELF συγκεντρωμένο δυαδικό μπορείτε να πάρετε το .pyc με:
Σε ένα python exe binary που έχει μεταγλωττιστεί, μπορείτε να πάρετε το .pyc εκτελώντας:
Από .pyc σε κώδικα python
Για τα .pyc δεδομένα ("συμπιεσμένος" python) θα πρέπει να ξεκινήσετε προσπαθώντας να εξαγάγετε τον αρχικό κώδικα python:
Βεβαιωθείτε ότι το δυαδικό αρχείο έχει την επέκταση ".pyc" (αν όχι, το uncompyle6 δεν θα λειτουργήσει)
Κατά την εκτέλεση του uncompyle6 μπορεί να βρείτε τα παρακάτω σφάλματα:
Σφάλμα: Άγνωστος μαγικός αριθμός 227
Για να το διορθώσετε, πρέπει να προσθέσετε τον σωστό μαγικό αριθμό στην αρχή του παραγόμενου αρχείου.
Οι μαγικοί αριθμοί διαφέρουν ανάλογα με την έκδοση python, για να αποκτήσετε τον μαγικό αριθμό της python 3.8 θα χρειαστεί να ανοίξετε ένα τερματικό python 3.8 και να εκτελέσετε:
Ο μαγικός αριθμός σε αυτή την περίπτωση για python3.8 είναι 0x550d0d0a
, στη συνέχεια, για να διορθώσετε αυτό το σφάλμα θα χρειαστεί να προσθέσετε στην αρχή του .pyc αρχείου τα εξής bytes: 0x0d550a0d000000000000000000000000
Μόλις έχετε προσθέσει αυτή την μαγική κεφαλίδα, το σφάλμα θα πρέπει να διορθωθεί.
Αυτή είναι η εμφάνιση μιας σωστά προστιθέμενης .pyc python3.8 μαγικής κεφαλίδας:
Σφάλμα: Αποσυμπίεση γενικών σφαλμάτων
Άλλα σφάλματα όπως: 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 λειτουργεί ως συνδυασμός αρκετών εργαλείων διαθέσιμων στην κοινότητα που έχουν σχεδιαστεί για να βοηθήσουν τους ερευνητές στην αποσυμπίεση και αποσυμπίεση εκτελέσιμων αρχείων γραμμένων σε Python, συγκεκριμένα αυτών που δημιουργήθηκαν με py2exe και pyinstaller. Περιλαμβάνει κανόνες YARA για να προσδιορίσει αν ένα εκτελέσιμο είναι βασισμένο σε Python και επιβεβαιώνει το εργαλείο δημιουργίας.
ImportError: Όνομα αρχείου: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' δεν υπάρχει
Ένα κοινό πρόβλημα που συναντάται περιλαμβάνει ένα ατελές αρχείο bytecode Python που προκύπτει από τη διαδικασία αποσυμπίεσης με unpy2exe ή pyinstxtractor, το οποίο στη συνέχεια αποτυγχάνει να αναγνωριστεί από το uncompyle6 λόγω έλλειψης αριθμού έκδοσης bytecode Python. Για να αντιμετωπιστεί αυτό, έχει προστεθεί μια επιλογή prepend, η οποία προσθέτει τον απαραίτητο αριθμό έκδοσης bytecode Python, διευκολύνοντας τη διαδικασία αποσυμπίεσης.
Παράδειγμα του προβλήματος:
Ανάλυση της συναρμολόγησης python
Αν δεν μπορέσατε να εξαγάγετε τον "αρχικό" κώδικα python ακολουθώντας τα προηγούμενα βήματα, τότε μπορείτε να προσπαθήσετε να εξαγάγετε τη συναρμολόγηση (αλλά δεν είναι πολύ περιγραφική, οπότε προσπαθήστε να εξαγάγετε ξανά τον αρχικό κώδικα). Στο εδώ βρήκα έναν πολύ απλό κώδικα για να αποσυναρμολογήσετε το .pyc δυαδικό (καλή τύχη στην κατανόηση της ροής του κώδικα). Αν το .pyc είναι από python2, χρησιμοποιήστε python2:
Python to Executable
Για να ξεκινήσουμε, θα σας δείξουμε πώς μπορούν να συμπιεστούν οι payloads σε py2exe και PyInstaller.
Για να δημιουργήσετε μια payload χρησιμοποιώντας το py2exe:
Εγκαταστήστε το πακέτο py2exe από http://www.py2exe.org/
Για την payload (σε αυτή την περίπτωση, θα την ονομάσουμε hello.py), χρησιμοποιήστε ένα σενάριο όπως αυτό στην Εικόνα 1. Η επιλογή “bundle_files” με την τιμή 1 θα συμπεριλάβει τα πάντα, συμπεριλαμβανομένου του διερμηνέα Python, σε ένα exe.
Μόλις το σενάριο είναι έτοιμο, θα εκδώσουμε την εντολή “python setup.py py2exe”. Αυτό θα δημιουργήσει το εκτελέσιμο, ακριβώς όπως στην Εικόνα 2.
Για να δημιουργήσετε ένα payload χρησιμοποιώντας το PyInstaller:
Εγκαταστήστε το PyInstaller χρησιμοποιώντας το pip (pip install pyinstaller).
Μετά από αυτό, θα εκδώσουμε την εντολή “pyinstaller –onefile hello.py” (υπενθύμιση ότι το ‘hello.py’ είναι το payload μας). Αυτό θα συγκεντρώσει τα πάντα σε ένα εκτελέσιμο αρχείο.
Αναφορές
Συμβουλή για bug bounty: εγγραφείτε στο Intigriti, μια premium πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers! Ελάτε μαζί μας στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε βραβεία έως $100,000!
Last updated