
Графовый мультиархитектурный подход на основе ML для обнаружения ROP-гаджетов
LCSAJdump — это фреймворк статического анализа, предназначенный для поиска гаджетов Return-Oriented Programming (ROP) и Jump-Oriented Programming (JOP). В отличие от традиционных сканеров, LCSAJdump является архитектурно-независимым и использует графовый подход для выявления уязвимостей, невидимых для обычных линейных инструментов.
Обычные ROP-сканеры используют линейный подход «скользящего окна» по исполняемым байтам бинарного файла. Этот метод систематически не обнаруживает теневые гаджеты (Shadow Gadgets): цепочки выполнения, проходящие через несмежные блоки памяти, соединённые безусловными переходами или условными ветвлениями.
LCSAJdump преодолевает это ограничение, восстанавливая граф потока управления (CFG) с помощью анализа LCSAJ (Linear Code Sequence and Jump). Моделируя бинарный файл как ориентированный граф базовых блоков, инструмент находит:
.text на базовые блоки LCSAJ и восстанавливает связи потоков через собственный обратный граф потока управления (легковесное представление смежности, без тяжёлых графовых зависимостей).--depth шагов, что значительно сокращает память и время сборки для больших бинарников (например, libc) при идентичных результатах.(см. Бенчмарки).
LCSAJdump спроектирован как универсальный. В настоящее время поддерживаются:
config.py.pip install lcsajdump
git clone [https://github.com/Chris1sFlaggin/LCSAJdump.git](https://github.com/Chris1sFlaggin/LCSAJdump.git)
cd LCSAJdump
pip install -r requirements.txt
LCSAJdump предоставляет мощный CLI для точного анализа бинарных файлов:
Стандартный анализ (по умолчанию RISC-V):
python LCSAJdump.py <путь_к_бинарнику>
Расширенный анализ (указание архитектуры и выходного файла):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <путь_к_бинарнику>
Экспорт в JSON с фильтром плохих символов:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <путь_к_бинарнику>
Примечание: Используйте
-oпосле--json, чтобы сохранить JSON в файл. Без--json-oсохраняет обычный текст.
Сохранение вывода в виде обычного текста:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <путь_к_бинарнику>
Анализ всех исполняемых секций:
lcsajdump --all-exec -d 25 -k 10 -l 30 <путь_к_бинарнику>
Принудительное строго алгоритмическое ранжирование (без ML):
lcsajdump --algo <путь_к_бинарнику>
LCSAJdump подкреплён строгим, инкрементально проверяемым набором тестов, расположенным в каталоге benchmarkTests/.
За 14 крупных итераций семантического инжиниринга признаков гибридная модель научилась различать гаджеты на основе реальных побочных эффектов в памяти (извлечённых с помощью символического выполнения angr), а не только синтаксических эвристик.
Оценка с помощью групповой 5-кратной кросс-валидации (тестовые бинарники никогда не использовались в обучении) показала для ранжировщика NDCG@1 = 0.914 ± 0.047 и NDCG@10 = 0.922 ± 0.052, что означает, что наиболее полезные гаджеты последовательно оказываются в верхней части вывода. Двухэтапный движок успешно отдаёт приоритет чистым последовательностям извлечения стека и вызовам типа ret2csu, при этом сильно штрафуя подверженные сбоям переходы с фиксированным смещением, которые обманывают традиционные статические сканеры.
Репозиторий структурирован так, чтобы поддерживать как конечных пользователей, так и исследователей ML.
lcsajdump/ml_study/ содержит полный конвейер, использованный для обучения моделей:
build_dataset.py: Извлекает структурные и семантические признаки из набора CTF-бинарников.train_model.py: Обучает модель LightGBM LambdaRank и выводит .pkl-модели.kfold_cv.py: Валидирует набор данных с помощью K-Fold кросс-валидации.Фреймворк открыт для новых реализаций. Чтобы добавить новую архитектуру:
lcsajdump/core/config.py.ARCH_PROFILES, определив мнемоники переходов, мнемоники возврата и регистры для нужной архитектуры (например, x86_64).Этот проект выпущен под лицензией MIT. Подробнее см. в файле LICENSE.
Посетите веб-страницу проекта: Страница LCSAJdump
| Флаг | Тип | По умолчанию | Описание |
|---|
-a, --arch | ТЕКСТ | auto | Целевая архитектура (auto, riscv64, x86_64, arm64). Автоопределение из ELF-заголовка. |
-d, --depth | ЦЕЛОЕ | 20 | Максимальная глубина поиска в блоках LCSAJ. Определяет длину цепочки. |
-k, --darkness | ЦЕЛОЕ | 5 | Порог обрезки — максимальное количество посещений на узел. Выше = больше гаджетов, медленнее сканирование. |
-l, --limit | ЦЕЛОЕ | 10 | Максимальное количество гаджетов для отображения в выводе. |
-s, --min-score | ЦЕЛОЕ | 0 | Минимальная эвристическая оценка для включения гаджета в результаты. |
-i, --instructions | ЦЕЛОЕ | 15 | Максимальное количество инструкций в одном узле LCSAJ. |
-v, --verbose | ФЛАГ | — | Включить подробный вывод для детализированных результатов по каждому гаджету. |
-o, --output | ПУТЬ | — | Запись вывода в файл. По умолчанию обычный текст; используйте с --json для вывода JSON. |
-b, --bad-chars | ТЕКСТ | — | Шестнадцатеричные байты для фильтрации из адресов гаджетов (например, "000a0d"). |
--json | ФЛАГ | — | Вывод гаджетов в структурированном JSON. Комбинируйте с -o для сохранения в файл. |
--all-exec | ФЛАГ | — | Анализировать все исполняемые секции, а не только .text. |
-al, --algo | ФЛАГ | — | Использовать строго алгоритмическое ранжирование (без ML). |
--version | ФЛАГ | — | Показать установленную версию и выйти. |
--help | ФЛАГ | — | Показать справку и выйти. |