
Историограф прошивок, работающий только с бинарными файлами, который учится находить функции в сырых бинарных файлах, извлекая известные функции из похожих бинарных файлов, что обеспечивает быстрое сопоставление функций без дизассемблирования для анализа встроенных прошивок.
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 в первую команду.
Статья, объясняющая внутреннее устройство, была опубликована на семинаре Workshop on Binary Analysis Research (BAR) 2021 под названием Polypyus - The Firmware Historian. Некоторые дополнительные детали также содержатся в презентации магистерской диссертации Яна, которая охватывает проблемы, возникающие при работе с традиционными подходами бинарного сравнения в режиме ARM Thumb2, и объясняет, как работает альтернативный подход, основанный только на бинарниках.
Утекшие символы в формате patch.elf или .symdefs содержат только имена функций и глобальных переменных. Однако существуют также файлы проекта Eclipse .pdom в WICED Studio 6.2 и 6.4. Они содержат дополнительную информацию о типах. Eclipse использует их внутренне для автодополнения, поиска функций и т.д., и мы можем использовать их в обратном направлении для добавления информации о типах. Поскольку файлы .pdom содержат только частичную, кэшированную информацию, может быть полезно объединить несколько из них.
На первом шаге мы экспортируем информацию о типах из .pdom в базу данных SQLite. Экспорт занимает некоторое время, но его можно даже прервать и продолжить позже. Экспорт работает следующим образом:
java -jar pdom/export/export.jar -P BCM20739-B0.1462220149391.pdom
Импорт PDOM ищет имена функций в базе данных IDA, находит их в PDOM для поиска информации о типах, а затем применяет эту информацию о типах в базе данных IDA. Таким образом, база данных IDA должна заранее содержать правильные имена функций. В принципе, их можно создать с помощью скриптов import_export из Polypyus. Однако несколько более продвинутые скрипты, поддерживающие импорт PDOM, также могут обрабатывать секции patch.elf. Запустите импорт следующим образом:
T=0x1 (Alt-g).patch.elf (Select file).20739mapb0.h для именования аппаратных регистров (Import map.h).Этот скрипт тестировался на IDA Pro 7.4 и 7.5.
После некоторого внутреннего тестирования мы можем рекомендовать следующий рабочий процесс при работе с IDA Pro и Polypyus:
Alt-g, T=0x1).0x0 с правами rx, RAM с адреса 0x200000 с правами rwx (по крайней мере для Bluetooth-прошивки).0x4 (o).
В прошивке CYW20735 он указывает на 0x3bc+1. Вернитесь на один байт назад и создайте функцию (p)....теперь ваша база IDA может стать немного полезной :) В ARM Thumb2 дизассемблер всё ещё много где ошибается, но это намного лучше, чем то, что IDA делает сама по себе.
Папка firmware содержит различные прошивки с символами и без них.
Всё в папке history содержит символы, всё в папке targets — без символов.
Для серии Samsung S8 также включает Note 8 и S8+ и т.д., а S10/S20 также включает всё от S10e до Note 20 5G.
Качество дампов может различаться, некоторые содержат RAM, а некоторые — только ROM. У нас есть доступ к большинству устройств из этого списка. Если вам нужен дамп с последними уровнями исправлений и включая RAM, обращайтесь к нам.
Несколько устройств, упомянутых в статье, не включены сюда, так как они могут не быть устройствами только для исследований и т.д. Также отсутствуют несколько iPhone и MacBook, поскольку у они есть как устройства только для исследований, но исходный дамп таковым не был. Эти устройства будут добавлены в ближайшее время :)
В этом репозитории есть файл .editorconfig. Он настраивает стиль отступов, кодировку и разделители строк. Следуйте этой конфигурации при участии, что можно упростить, используя плагин IDE для .editorconfig.
Для установки зависимостей для тестирования выполните
pip install '.[test]'
это установит пакеты, которые нужны только для выполнения тестов.
Зависимости для разработки предоставляют, например, заглушки для типов пакетов. Для их установки выполните
pip install '.[development]'
pytest запустит все тесты.
Проект использует tox для локального запуска тестов с разными версиями Python. Tox настроен на тестирование с версиями 3.6, 3.7, 3.8 и 3.9. Для запуска tox установите зависимости для тестирования и установите эти 4 упомянутые версии Python. Наш рекомендуемый способ установки и управления несколькими версиями Python — pyenv.
Шаги:
pyenv install 3.9.1
pyenv install 3.8.6
pyenv install 3.7.9
pyenv install 3.6.12
pyenv virtualenv 3.9.1 polypyus
penv local polypyus 3.8.6 3.7.9 3.6.12
pip install '.[test]'
pip install '.[development]'
toxPolypyus использует GitHub Actions для автоматического запуска тестов и некоторого линтинга. Если хотите, вы можете запускать шаги линтинга локально с помощью pre-commit git-хуков.
Каждый раз перед созданием нового коммита это вызовет линтинг и покажет проблемы, которые помешали бы этому коду пройти шаг линтинга в GitHub Actions. Также это форматирует изменённые файлы с помощью black.
pip install '.[development]'
pre-commit install
Мы благодарим Анну Штихлинг за создание логотипа Polypyus. Также благодарим Кристиана Блихмана и Джоксеана Корета за их отзывы.
Polypyus является открытым исходным кодом и распространяется под лицензией GPLv3.
| Чип | Устройство | Дата сборки | Символы |
|---|
| BCM20703A2 | MacBook/iMac 2016-2017 | Oct 22 2015 | ✔ |
| CYW20719B1 | Оценочная плата | Jan 17 2017 | ✔ |
| CYW20735B1 | Оценочная плата | Jan 18 2018 | ✔ |
| CYW20819A1 | Оценочная плата | May 22 2018 | ✔ |
| Чип | Устройство | Дата сборки | Символы |
|---|
| BCM2046A2 | iMac Late 2009 | 2007? | - |
| BCM2070B0 | MacBook 2011, Thinkpad T420 | Jul 9 2008 | - |
| BCM20702A1 | USB-донгл Asus | Feb (?) 2010 | - |
| BCM4345B0 | iPhone 6 | Jul 15 2013 | - |
| BCM4335C0 | Google Nexus 5 | Dec 11 2012 | - |
| BCM4345B0 | Google Nexus 6P / Galaxy S6 | Oct 23 2014 | - |
| BCM43430A1 | Raspberry Pi 3 and Zero W | Jun 2 2014 | - |
| BCM4345C0 | Raspberry Pi 3+ and 4 | Aug 19 2014 | - |
| BCM4347B0 | Samsung Galaxy S8 series | Jun 3 2016 | - |
| BCM4375B1 | Samsung Galaxy S10/20 series | Apr 13 2018 | - |
| BCM4378B1 | iPhone 11/SE2 | Oct 25 2018 | Строки |