
Историограф прошивок, работающий только с бинарными файлами, который учится находить функции в сырых бинарных файлах, извлекая известные функции из похожих бинарных файлов, что обеспечивает быстрое сопоставление функций без дизассемблирования для анализа встроенных прошивок.
Polypyus учится находить функции в сырых бинарных файлах, извлекая известные функции из похожих бинарников. Таким образом, это историк прошивок. Polypyus работает без дизассемблирования этих бинарных файлов, что является преимуществом для бинарников, которые сложно дизассемблировать и в которых обычные инструменты пропускают функции. Кроме того, подход, основанный только на бинарниках, делает его очень быстрым и позволяет выполнять анализ за несколько секунд. Однако этот подход требует, чтобы бинарники были одной и той же архитектуры и имели схожие параметры компилятора.
Polypyus интегрируется в рабочий процесс существующих инструментов, таких как Ghidra, IDA, BinDiff и Diaphora. Например, он может импортировать ранее аннотированные функции и учиться на них, а также экспортировать найденные функции для импорта в IDA. Поскольку Polypyus использует довольно строгие пороги, в наших экспериментах он находил только правильные совпадения. Хотя это приводит к меньшему количеству результатов по сравнению с существующими инструментами, это хорошая отправная точка для загрузки этих совпадений в IDA для улучшения результатов автоанализа, а затем запуска BinDiff поверх.
Работая с сырыми бинарными файлами прошивок, а именно с различными версиями Bluetooth-прошивок Broadcom и Cypress, мы обнаружили, что автоанализ IDA часто неправильно определяет начала функций. В IDA Pro 6.8 автоанализ был немного агрессивнее, что давало больше результатов, но также и больше ложных срабатываний. В целом, IDA Pro 7.2 был более пессимистичным, но пропускал множество функций. Это привело к тому, что между нашими прошивками в IDA Pro 6.8 было всего несколько совпадений BinDiff, а в IDA Pro 7.2 не было полезных совпадений вовсе.
Интересно, что BinDiff часто не мог идентифицировать функции, которые, за исключением ветвлений, были побайтно идентичны. Обратите внимание, что Polypyus ищет именно такие побайтно идентичные функции. Мы предполагаем, что BinDiff не справляется с этими функциями из-за другого графа вызовов, порождённого пропущенными функциями и ложными срабатываниями. Иногда эти функции уже были распознаны IDA, но часто IDA либо не распознавала их как код, либо не помечала как функции. Заметим, что у Diaphora схожие проблемы, так как она экспортирует функции, идентифицированные IDA, перед дальнейшей обработкой. Ниже показан бенчмарк на бинарном файле Bluetooth-прошивки CYW20735B1, сравнивающий различные дизассемблеры и показывающий, как ошибки дизассемблера приводят к последующим проблемам при сравнении.
Более того, хотя мы обнаружили, что Amnesia находит много функций, он также находит много ложных срабатываний. Однако многие функции имеют похожую настройку стекового кадра в начале. Таким образом, Polypyus имеет опцию изучения общих начал функций из аннотированных входных бинарников и применения этого к другим бинарникам для идентификации функций без сопоставления их имён. Этот опциональный шаг применяется только к областям, в которых ранее не были найдены функции, таким образом метод общих начал функций и основной поиск функций не конфликтуют.
Поскольку эти сопоставители работают с сырым бинарным файлом, они не зависят от дизассемблера. Это также имеет один важный недостаток: если были разные параметры компилятора или другая целевая архитектура, Polypyus не обнаружит похожие функции. Кроме того, хотя найденные совпадения очень надёжны, идентификация начал функций немного менее надёжна, поэтому используйте последнюю с осторожностью. Ниже вы можете видеть, что оценочные наборы Cypress очень похожи друг на друга, но прошивка MacBook сильно отличается.
Polypyus создаёт нечёткие бинарные сопоставители, сравнивая общие функции в наборе аннотированных бинарных файлов прошивок.
В настоящее время поддерживаются следующие аннотации:
patch.elf от WICED Studio, который является специальным ELF-файлом, содержащим только определения символов..symdefs, создаваемый большинством ARM-компиляторов..csv с форматом, описанным в папке firmware.Эти аннотации содержат адрес, размер и имя известных функций. Чем больше общих черт имеют входные бинарники в коллекции истории, тем лучше для производительности и результатов Polypyus. Имея несколько слегка отличающихся функций, Polypyus создаёт очень хорошие сопоставители.
Polypyus требует Python 3 >= 3.6. Мы советуем использовать виртуальное окружение для следующей установки. Клонируйте этот репозиторий и в этой папке выполните:
pip install .
После установки доступны следующие команды:
polypyus-guipolypyus-cliPolypyus доступен через графический и командный интерфейс.
Оба — GUI polypyus-gui и CLI polypyus-cli — принимают следующие аргументы при вызове:
--verbose уровень подробности. По умолчанию показывает предупреждения -v показывает информацию -vv показывает отладочную информацию.
--project задаёт расположение файла проекта. Это либо путь к файлу, либо ":memory:".
--help Показать справку.
Опция проекта позволяет сохранять работу для разных контекстов в разных файлах и также открывать их снова.
Общий рабочий процесс GUI идёт слева направо в окне.
Сначала в историю добавляются бинарники. Затем следуют аннотации символов к записям в истории.
После этого можно добавить целевые бинарники.
Для сопоставления нажмите Create matchers from history. После создания сопоставителей можно выбрать отдельные цели или сопоставить все цели, выбрав batch match.
Наконец, результаты можно экспортировать в файл .csv.
Ниже вы можете увидеть демонстрационное видео, где Polypyus тратит всего несколько секунд на обучение по двум входным бинарникам, их аннотирование, создание сопоставителей и применение совпадений к новому бинарнику.
Преимущество использования CLI — возможность автоматизации. На данный момент формат вывода CLI может измениться. Тем не менее, вот пример его вызова:
polypyus-cli --history firmware/history/20819-A1.bin --annotation firmware/history/20819-A1_patch.elf --history firmware/history/20735B1.bin --annotation firmware/history/20735B1_patch.elf --project test.sqlite
polypyus-cli --target firmware/history/20739B1.bin --project test.sqlite
Первая команда создаёт test.sqlite как новый файл проекта и импортирует 20819-A1.bin и 20735B1.bin с соответствующими файлами patch.elf.
Второй вызов использует тот же файл проекта и выполняет сопоставление с бинарником 20739B1.bin.
Для каждой команды количество --history и --annotation должно совпадать.
Эти две команды можно объединить в одну, добавив аргумент --target в первую команду.