Decompile compiled python binaries (exe, elf) - Retreive from .pyc
Wskazówka dotycząca bug bounty: Zarejestruj się na platformie Intigriti, premium platformie bug bounty stworzonej przez hakerów, dla hakerów! Dołącz do nas na https://go.intigriti.com/hacktricks już dziś i zacznij zarabiać nagrody aż do $100,000!
Z pliku skompilowanego do .pyc
Z pliku skompilowanego ELF można uzyskać plik .pyc za pomocą:
W skompilowanym pliku python exe binary można uzyskać plik .pyc, uruchamiając:
Z pliku .pyc do kodu Pythona
Dla danych w formacie .pyc ("skompilowany" kod Pythona) należy rozpocząć próbę wyodrębnienia oryginalnego kodu Pythona:
Upewnij się, że plik binarny ma rozszerzenie ".pyc" (jeśli nie, uncompyle6 nie będzie działać)
Podczas wykonywania uncompyle6 możesz napotkać następujące błędy:
Błąd: Nieznany numer magiczny 227
Aby to naprawić, musisz dodać poprawny numer magiczny na początku wygenerowanego pliku.
Numery magiczne różnią się w zależności od wersji Pythona, aby uzyskać numer magiczny Pythona 3.8, musisz otworzyć terminal Pythona 3.8 i wykonać:
W tym przypadku numer magiczny dla pythona 3.8 to 0x550d0d0a
, następnie, aby naprawić ten błąd, musisz dodać na początku pliku .pyc następujące bajty: 0x0d550a0d000000000000000000000000
Po dodaniu tego magicznego nagłówka, błąd powinien zostać naprawiony.
Tak będzie wyglądał poprawnie dodany nagłówek magiczny .pyc pythona 3.8:
Błąd: Dekompilacja ogólnych błędów
Inne błędy takie jak: class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>
mogą się pojawić.
Oznacza to prawdopodobnie, że nie dodałeś poprawnie numeru magicznego lub nie użyłeś poprawnego numeru magicznego, więc upewnij się, że używasz właściwego (lub spróbuj nowego).
Sprawdź dokumentację dotyczącą poprzedniego błędu.
Narzędzie automatyczne
Narzędzie python-exe-unpacker służy jako kombinacja kilku narzędzi dostępnych w społeczności, przeznaczonych do pomocy badaczom w rozpakowywaniu i dekompilowaniu plików wykonywalnych napisanych w Pythonie, w szczególności tych utworzonych za pomocą py2exe i pyinstaller. Zawiera reguły YARA do identyfikacji, czy plik wykonywalny jest oparty na Pythonie, oraz potwierdza narzędzie tworzenia.
ImportError: Nazwa pliku: 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' nie istnieje
Częstym problemem napotykanym podczas procesu rozpakowywania za pomocą unpy2exe lub pyinstxtractor jest niekompletny plik bajtowy Pythona, co skutkuje nieuznaniem go przez uncompyle6 z powodu braku numeru wersji bajtów Pythona. Aby temu zaradzić, dodano opcję prepend, która dodaje niezbędny numer wersji bajtów Pythona, ułatwiając proces dekompilacji.
Przykład problemu:
Analiza asemblera Pythona
Jeśli nie udało ci się wydobyć "oryginalnego" kodu Pythona, postępuj zgodnie z poprzednimi krokami, a następnie spróbuj wydobyć asembler (jednak nie jest on zbyt opisowy, więc spróbuj ponownie wydobyć oryginalny kod). W tutaj znalazłem bardzo prosty kod do dysasemblacji pliku .pyc (powodzenia z zrozumieniem przepływu kodu). Jeśli plik .pyc pochodzi z Pythona 2, użyj Pythona 2:
Python do pliku wykonywalnego
Aby rozpocząć, pokażemy Ci, jak ładunki mogą być skompilowane za pomocą py2exe i PyInstaller.
Aby utworzyć ładunek za pomocą py2exe:
Zainstaluj pakiet py2exe z http://www.py2exe.org/
Dla ładunku (w tym przypadku nazwiemy go hello.py), użyj skryptu podobnego do tego z Rysunku 1. Opcja "bundle_files" z wartością 1 spowoduje, że wszystko, włącznie z interpreterem Pythona, zostanie spakowane w jedno exe.
Gdy skrypt będzie gotowy, wydamy polecenie "python setup.py py2exe". Spowoduje to utworzenie pliku wykonywalnego, tak jak na Rysunku 2.
Aby utworzyć ładunek za pomocą PyInstaller:
Zainstaluj PyInstaller za pomocą pip (pip install pyinstaller).
Następnie wydamy polecenie „pyinstaller --onefile hello.py” (przypomnijmy, że „hello.py” to nasz ładunek). Spowoduje to spakowanie wszystkiego w jedno wykonywalne plik.
Odnośniki
Wskazówka dotycząca nagrody za błąd: Zarejestruj się na platformie do nagród za błędy Intigriti, stworzonej przez hakerów, dla hakerów! Dołącz do nas na https://go.intigriti.com/hacktricks już dziś i zacznij zarabiać nagrody do 100 000 dolarów!
Last updated