Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!
Από Μεταγλωττισμένο Δυαδικό σε .pyc
Από ένα ELF μεταγλωττισμένο δυαδικό μπορείτε να ανακτήσετε το .pyc με:
Σε ένα δυαδικό αρχείο εκτελέσιμου Python, μπορείτε να λάβετε το αρχείο .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. Για να αντιμετωπιστεί αυτό, προστέθηκε μια επιλογή προσάρτησης, η οποία προσθέτει τον απαραίτητο αριθμό έκδοσης bytecode Python, διευκολύνοντας τη διαδικασία αποσυναρμολόγησης.
Παράδειγμα του προβλήματος:
Ανάλυση python assembly
Αν δεν μπορέσατε να εξάγετε το "πρωτότυπο" κώδικα Python ακολουθώντας τα προηγούμενα βήματα, τότε μπορείτε να προσπαθήσετε να εξάγετε το assembly (αλλά δεν είναι πολύ περιγραφικό, οπότε προσπαθήστε να εξάγετε ξανά τον πρωτότυπο κώδικα). Σε αυτό το σύνδεσμο βρήκα έναν πολύ απλό κώδικα για αποσυναρμολόγηση του αρχείου .pyc (καλή τύχη στην κατανόηση της ροής του κώδικα). Αν το αρχείο .pyc είναι από Python 2, χρησιμοποιήστε την Python 2:
Μετατροπή από Python σε εκτελέσιμο
Για να ξεκινήσουμε, θα σας δείξουμε πώς μπορούν τα φορτία να μεταγλωττιστούν σε py2exe και PyInstaller.
Για να δημιουργήσετε ένα φορτίο χρησιμοποιώντας το py2exe:
Εγκαταστήστε το πακέτο py2exe από http://www.py2exe.org/
Για το φορτίο (σε αυτήν την περίπτωση, θα το ονομάσουμε hello.py), χρησιμοποιήστε ένα σενάριο όπως αυτό στο Σχήμα 1. Η επιλογή "bundle_files" με την τιμή 1 θα συγκεντρώσει τα πάντα, συμπεριλαμβανομένου του διερμηνέα Python, σε ένα εκτελέσιμο αρχείο.
Μόλις το σενάριο είναι έτοιμο, θα δώσουμε την εντολή "python setup.py py2exe". Αυτό θα δημιουργήσει το εκτελέσιμο, ακριβώς όπως στο Σχήμα 2.
Για να δημιουργήσετε ένα payload χρησιμοποιώντας το PyInstaller:
Εγκαταστήστε το PyInstaller χρησιμοποιώντας το pip (pip install pyinstaller).
Στη συνέχεια, θα δώσουμε την εντολή "pyinstaller --onefile hello.py" (να θυμάστε ότι το 'hello.py' είναι το payload μας). Αυτό θα συσκευάσει τα πάντα σε ένα εκτελέσιμο αρχείο.
Αναφορές
Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!
Last updated