Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
am335xbootrom — Обратная разработка загрузочного ПЗУ TI AM3358 | Kitploit
Инструменты/GitHubGitHub/sjgallagher2/am335xbootrom
Безопасность встроенных системОбратная инженерияОтладчикиАппаратный ХакингАнализ Бинарных ФайловОбучение и ОбразованиеАнализ Прошивок
GitHubsjgallagher2/am335xbootrom

am335xbootrom

Обратная разработка загрузочного ПЗУ TI AM3358

Репозиторий
615172 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Обратная разработка загрузочного ПЗУ AM335x

Прошло, наверное, восемнадцать месяцев с тех пор, как я впервые заполучил несколько плат Beaglebone Black, спасённых из мусорного бака. К сожалению, платы не заработали сразу. Это был мой первый опыт работы с такими платами, да и с любым одноплатным компьютером, поэтому я не был уверен, проблема в том, что я делаю что-то не так, или в самих платах (возможно, именно поэтому они и отправились в мусорный бак). У меня ушло довольно много времени и огромное количество усилий, чтобы заставить эти платы действительно начать загружаться, но, чёрт возьми, у меня получилось. И вот что я узнал на этом пути.

ПРИМЕЧАНИЕ: Как использовать XML-файл Ghidra

Я включил в этот репозиторий несколько утилит, а также xml-файл, экспортированный из Ghidra, со всеми символами, которые мне удалось получить в ходе реверса. Я использовал этот пост, чтобы выполнить экспорт без самой прошивки и избежать возможных проблем с авторскими правами. Если вы хотите отлаживать загрузочное ПЗУ самостоятельно, у вас уже будет подключён JTAG, так что вы сможете сами снять дамп загрузочного ПЗУ (с 0x20000 по 0x2BFFF).

Чтобы загрузить символы:

  1. Создайте новый проект Ghidra. Импортируйте двоичный файл (не XML) в Ghidra: используйте ARMv7 Little Endian и убедитесь, что в Options вы установили базовый адрес 0x20000; имя блока можно задать как bootrom.
  2. Откройте этот двоичный файл в CodeBrowser. НЕ ЗАПУСКАЙТЕ АНАЛИЗ.
  3. Перейдите в File > Add program и выберите XML-файл. Настройки по умолчанию должны подойти. Теперь вы можете пройти по обработчику сброса, перейти к main() или к обработчику загрузки с MMC/SD-карты.

Проблема

Для начала я знал, что это кастомные версии стандартной Beaglebone Black, поэтому довольно рано решил, что проблема может быть в отсутствии чего-то на самой плате, например идентификатора платы. При загрузке стандартной SD-карты, отформатированной с помощью balenaEtcher, я не видел ничего. Я ожидал, что светодиоды на плате начнут мигать, и что подключение кабеля UART-USB позволит мне увидеть процесс U-Boot. Однако UART молчал. Если я вынимал SD-карту, он снова и снова выводил букву C, что является ожидаемым поведением для загрузки через UART/последовательный порт. Плата определённо пыталась загрузиться, и SD-карта меняла это поведение, но у меня не было никакой дополнительной видимости. Большинство инструкций по устранению неполадок в интернете использовали вывод U-Boot как отправную точку для диагностики. Похоже, такой роскоши у меня не будет.

В этот момент я решил, что стоит подключить отладочный зонд. К сожалению, у меня не было подходящего разъёма под существующее посадочное место, поэтому я сделал свой.

Плата Beaglebone имеет разъём с обозначением P2, на который выведены соединения JTAG. Я подсоединил к нему провода, ведущие к маточному разъёму, чтобы можно было общаться с ней через мой J-Link.

Запустив Ozone (отладчик Segger), я настроил J-Link и начал с попытки найти точку входа. Я думал, что reset-halt поместит меня туда, куда нужно, и из-за этого пришёл к (неверному) предположению, что точка входа — 0x2148a, хотя, конечно, замечал, что это непостоянно. Позже я понял, что платы AM335x плохо ладят с reset-halt'ом J-Link, поэтому на самом деле была задержка в несколько сотен тактов, из-за которой я недетерминированно попадал куда-то внутрь загрузочного обработчика. (В конце концов я обошёл это, написав GEL-файл для Code Composer Studio от TI, который поддерживает отладку через J-Link — при сбросе регистр PC устанавливается на обработчик сброса, регистры очищаются, а режим инструкций принудительно переключается на ARM.)

Из ветки на форумах TI (AM335x: сотрудники TI, где я могу получить исходный код/символы загрузчика ПЗУ?) я раздобыл пару отладочных символов: SPI Initialize по адресу 0x231e0, SPI ReadSectors по адресу 0x23230, а 0x24bfa — это процедура чтения через UART. Полезная помощь, пожалуй. Я заметил, что загрузка завершалась неудачей, уходя в бесконечный цикл по адресу 0x402f0440 — мёртвый цикл. Хм, довольно далеко от остального загрузочного ПЗУ, наверное, это в RAM или что-то вроде того. Пожалуй, пора заглянуть в техническое справочное руководство (TRM)!

Глава 26 TRM содержит массу информации о загрузке. Мы получаем следующее представление загрузочного ПЗУ:

Описание:

Архитектура Public ROM Code показана на рисунке 26-1. Она разделена на три основных уровня по принципу «сверху вниз»: высокоуровневый, драйверы и уровень аппаратных абстракций (HAL). Каждый уровень взаимодействует с нижележащим уровнем через унифицированный интерфейс. Высокоуровневый уровень отвечает за основные задачи Public ROM Code: настройку сторожевого таймера и тактовых частот, а также основную процедуру загрузки. Уровень драйверов реализует логические и коммуникационные протоколы для любого загрузочного устройства в соответствии со спецификацией интерфейса. Наконец, HAL реализует низкоуровневый код для взаимодействия с аппаратными IP-блоками. Конечные загрузочные устройства подключаются к контактным площадкам ввода-вывода.

На рисунке 26-2 показан высокоуровневый процесс загрузки Public ROM Code. На этом устройстве Public ROM Code запускается после завершения безопасного запуска (выполняемого Secure ROM Code). Затем ROM Code выполняет конфигурацию и инициализацию платформы в рамках публичной процедуры запуска. Список загрузочных устройств создаётся на основе выводов SYSBOOT. Загрузочным устройством может быть устройство загрузки из памяти (распаянная flash-память или временное загрузочное устройство вроде карты памяти) или периферийный интерфейс, подключённый к хосту. Основной цикл процедуры загрузки проходит по списку загрузочных устройств и пытается найти образ на текущем выбранном загрузочном устройстве. Цикл завершается, если найден и успешно выполнен валидный загрузочный образ, или по истечении времени сторожевого таймера. На HS-устройстве процедура проверки подлинности образа выполняется до его запуска. Сбой процедуры проверки подлинности приводит к переходу в «мёртвый цикл» в Secure ROM (в ожидании сброса по сторожевому таймеру).

Карта памяти! Векторы исключений! Блок-схемы! В этом разделе масса информации. Моя задача стала намного проще.

В этот момент я использовал JTAG-зонд, чтобы выгрузить прошивку в несколько разных файлов, и начал загружать их в Ghidra. Похоже, не существовало SVD-файлов или других описаний регистров в удобном формате, что очень обидно, потому что это означало, что мне нужно вручную определять области памяти, регистры и всё остальное. Это был утомительный процесс, но через некоторое время у меня появился python-скрипт, с помощью которого я мог загружать символы в Ghidra для AM3358. Одной проблемой меньше!

Реверс-инжиниринг

Скачать инструмент