В этой статье я покажу, как разобрать девайс, чтобы исследовать интерфейсы отладки, получение прошивки устройства или доступа к консоли управления. Если вы новичок в этой области, статья предложит вам подробный алгоритм действий, который позволит успешно справиться с подобной задачей.
Вы наверное как и я любили в детстве все разбирать и изучать, как и что работает. Некоторые повзрослели, а я все еще люблю этим заниматься )). В этой статье, я расскажу о том, как вытащить прошивку с любого устройства и как разрабы пытаются это предотвратить.
У старых ламповых приемников не было вообще никаких прошивок, а единственная защита, которая у них была — это анодное напряжение. В наше время все иначе: мне попадаются гаджеты, которые пытаются противодействовать уже на этапе вскрытия корпуса. Начнем наше увлекательное путешествие.
- Оборудование
- Память
- EEPROM
- FRAM
- NOR/NAND Flash
- Чтение прошивки
- Определяем интерфейсы на контактах
- Осциллограф
- Логический анализатор
- Мультиметр
- Arduino
- JTAGenum
- JTAGulator
- Корпуса микросхем
- Маркировка
- Типовой дизайн
- Бытовые роутеры
- Устройства для ответственного применения
- IoT
- Смартфоны
- Осмотр платы устройства
- Изучение платы устройства
- Поиск информации в интернете
- Ищем информацию о чипах
- Изучаем разъемы
- Поиск документации
- Разбираем устройство
- Винты
- Сторонние материалы на плате
- Защита от вскрытия
- Расшифровка имени
- Взаимодействие с интерфейсами
- I2C
- SPI
- SWD
- Извлечение прошивки камеры
- Контакты микросхем
- В завершение
- Полезная нагрузка
- Получение root-консоли
- Аргументы запуска
- Подмена прошивки
- Метод швейной иглы
- Подготовка к чтению прошивки
- Узнайте больше о Huawei
Оборудование
Тут можно только сказать, чего делать не стоит: не надо брать дешевые инструменты и расходники. Из моего любимого — припой, который плавится при совершенно неожиданных температурах, проводящий флюс (!) и одноразовые пинцеты.
Подробнее хочется рассказать о дешевом флюсе. Как пример — ТТ, также известный как розовый гель. Он хорош, но он не отмывается и проводит ток на высоких частотах. Это не проблема в советском радио или даже современном блоке питания, но вот на платах компьютеров с гигагерцами частоты он категорически противопоказан.
Снятие компаунда — это вопрос температуры. Я обычно грею феном на ~250 градусов, но есть одна проблемка. И состоит она в том, что под компаундом компоненты могут быть припаяны низкотемпературным припоем, вроде сплавов Розе или Вуда. Да, компаунд ты снимешь, но вместе с ним сойдет половина платы. А хитрая флешка может не завестись без кучи рассыпухи, которую обратно уже не собрать.
При снятии компаунда не забывай о вытяжке — твое здоровье важнее любой микросхемы!
Что делать, если плата покрыта лаком? Можно попробовать свести его ацетоном, но он может повредить текстолит. Делай так, только если тебе терять нечего. Для остальных случаев — просто снимать скальпелем в нужных местах, а остальное не трогать.
При пайке ориентируйся на график термопрофиля в конце даташита на микросхему. Он там размещается не просто так, и на моей памяти действительно были случаи, когда микросхема умирала от перегрева при извлечении. Как известно, люди делятся на тех, кто не смотрит графики в документации, и тех, кто уже смотрит.
К заводскому припою часто имеет смысл примешать менее тугоплавкий сплав Розе или ПОС63, ну или сплав Вуда, если все совсем плохо. Это значительно понизит температуру пайки и увеличит шансы не сжечь микруху.
Память
Прежде чем я расскажу, что и как делать с памятью, давай сначала разберемся, какая она вообще бывает и как ее отличить от других компонентов на плате.
По опыту процессор (на скриншоте выше по центру) обычно квадратной формы и исполняется в BGA, а память прямоугольная и делается в SOP-корпусах.
Часто в ультрапортативных вычислительно мощных устройствах (смартфонах, например) используется бутерброд из процессора и памяти — так меньше размеры и задержки при работе. Форм‑фактор, конечно, BGA — просто потому, что ничего другого в крохотный корпус запихнуть нельзя.
ROM — постоянную память — отличить довольно легко. Предположим, чип с ней ты уже нашел. Теперь давай разберемся, какая она бывает.
Нас интересует EEPROM (Electrically Erasable Programmable Read-Only Memory), FRAM (сегнетоэлектрическая память) и NOR/NAND flash — они тебе уже и так знакомы. Из них ты мог не слышать только о FRAM — ее начали применять около пяти лет назад, так что она еще не особо популярна.
EEPROM
Среди особенностей этой памяти — побайтовые чтение и запись. Такая память самая долговечная: по расчетам, она может сохранять информацию в течение примерно двухсот лет! Но за надежность приходится платить — главным образом объемом, с котором у этого вида памяти все плохо: типичный объем такого чипа измеряется в килобайтах. Из‑за низкого объема для хранения прошивок этот тип памяти почти не применяется. Ну а раз заговорили о минусах — стоит и о низкой скорости сказать.
Устройство ячейки памяти EEPROM
Ресурс ячейки — около миллиона циклов перезаписи. По сравнению с современными ячейками NAND, у которых этот показатель находится в пределах нескольких десятков тысяч циклов, EEPROM-память просто нереально надежная.
РЕКОМЕНДУЕМ:
Как снять дамп прошивки и получить доступ к консоли управления гаджета
FRAM
FRAM — это совсем новый тип энергонезависимой памяти. Промышленно его применять стали всего несколько лет назад, так что шанс встретить именно FRAM в каком‑нибудь умном холодильнике небольшой, но скоро все может поменяться. Пока что основная проблема в цене, которая несколько выше, чем у других типов памяти.
Устройство FRAM-ячейки. Похоже на DRAM, правда?
От EEPROM отличается фундаментально другим принципом запоминания информации: хранится не заряд на затворе, а знак поляризации сегнетоэлектрика. При приложении напряжения она меняется на противоположную, что позволяет читать такую память и писать в нее.
Из‑за нового принципа работы такая память значительно быстрее, чем EEPROM, но ее долговечность осталась практически неизменной.
NOR/NAND Flash
NOR/NAND-флеш‑память — это просто EEPROM, собранный в массив. N OR от NAND отличается только способом упаковки в массив, но это небольшое различие ведет к достаточно сильным отличиям в такой памяти.
NOR быстрее и надежнее, чем NAND, но стоит дороже из‑за меньшей плотности компоновки. N AND же, напротив, дешевый как мусор, но имеет проблемы с надежностью.
NOR- и NAND-память используется в SSD и всяких флешках. Из‑за низкой надежности NAND-памяти такие накопители в обязательном порядке имеют большой пул запасных ячеек, недоступных для обычного использования, и умный контроллер, который всем этим хозяйством рулит. Держать такой оверхед в ширпотребных умных мультиварках непростительно дорого, так что применяется обычно NOR, а NAND остается для пользовательских накопителей, где проблемы надежности можно переложить на пользователя, который не делает бэкапы. Хотя нет — даже в дешевых роутерах он все чаще применяется благодаря программным механизмам защиты целостности.
Сводная таблица NOR NAND FRAM EEPROM
NOR был бы идеален, если бы не его цена, так что рыночек порешал — и теперь у нас всех используется NAND почти везде. Даже во встраиваемой технике уже почти научились с ним безопасно работать — контрольные суммы, ECC-коды и резервные блоки. Красота!
Чтение прошивки
Помни, что память NOR flash идет с завода без битых ячеек, а у NAND есть допустимый процент брака, так что, если в NAND видны битые ячейки, не спеши расстраиваться.
Программатор перед чтением нужно правильно настроить. В частности, надо заставить его читать все, включая системные страницы в начале и конце памяти — они бывают крайне важны!
Разработчики чипа настоятельно рекомендуют разработчикам устройства использовать свои чипы в соответствии с некоторыми правилами. Но вторые вольны не подчиняться первым, так что системные страницы порой оказываются хранилищем ключей шифрования или каких‑то других данных. В общем, читай все — лишним точно не будет.
РЕКОМЕНДУЕМ:
Способы защиты микроконтроллера
Вот теперь у тебя есть образ, который можно грузить в IDA и ковыряться дальше, но это уже тема для отдельной статьи.
Статья написана по мотивам доклада Демида Узенькова — специалиста компании ИНФОРИОН. Выступление состоялось на конференции RuCTFE 2020. За помощь в подготовке публикации редакция благодарит команду «Хакердом».
(9 оценок, среднее: 4,33 из 5)
Определяем интерфейсы на контактах
После того как мы разобрались с контактами, нам потребуется определить, какие протоколы работают на отладочных пинах. В этой части статьи мы рассмотрим оборудование, предназначенное для исследования протоколов взаимодействия с нашим девайсом.
Осциллограф
С осциллографами многие уже знакомы. Этот прибор позволяет визуально и программно определить активность на соответствующих пинах. Минус такого решения заключается в высокой стоимости осциллографа. А плюс — в том, что вы получаете полноценное оборудование для определения интерфейсов. К тому же многие дорогие осциллографы имеют функцию логического анализатора.
Логический анализатор
Существует несколько конкурирующих логических анализаторов, например DSLogic и Saleae Logic. Сравнительные характеристики этих устройств можно найти в интернете, мы же рассмотрим работу с анализатором Saleae Logic.
Стоимость девайса — от 500 долларов (для студентов предусмотрена скидка 50%). Контакты подключаем к исследуемым пинам, включаем устройство в режим прослушивания и наблюдаем примерно следующую картину.
Определить протоколы, которые используются на выбранных нами пинах, можно либо визуально, либо программно — для этого в интерфейсе приложения анализатора имеется специальная вкладка Analyzers. В некоторых случаях вам придется подбирать параметры — например, скорость передачи данных.
Мультиметр
При помощи мультиметра можно установить наличие сигнала на определенных пинах — достаточно найти контакты, на которых периодически будет подскакивать напряжение. Это удобно, если на исследуемой вами плате полно пинов, на проверку которых другими способами может уйти много времени.
Arduino
Если у вас есть Arduino и, желательно, небольшой экран для него, из этого комплекта вполне можно собрать портативный осциллограф. Как это делать, подскажет Великий Гугль — в интернете можно отыскать готовые проекты подобных приборов.
JTAGenum
В некоторых случаях нужно догадаться, какой протокол вероятнее всего используется на том или ином интерфейсе. Для интерфейса JTAG существует специальный проект JTAGenum.
С помощью JTAGenum исследователь может определить, какой пин на изучаемой плате за что отвечает. Для этого достаточно приобрести Arduino, загрузить на него ПО JTAGenum и подключить контакты со 2-го по 11-й к тестируемой плате, после чего запустить сканирование. Пример работы такого устройства показан на следующей иллюстрации.
JTAGulator
Эта гламурная розовая плата в стиле Hello Kitty предназначена для решения тех же проблем, что и JTAGenum. Преимущества у этой платы, которая называется JTAGulator, следующие:
Кроме того, в настоящее время ведется разработка ПО для применения JTAGulator в роли логического анализатора.
Из минусов стоит отметить только ее высокую стоимость — порядка 175 долларов.
Какой вариант лучше? Об этом подробно рассказано в статье JTAGulator vs. J TAGenum, Tools for Identifying JTAG Pins in IoT Devices. Спойлер: и Arduino, и JTAGulator прекрасно справились со своей задачей.
Корпуса микросхем
Как видишь, с корпусами у памяти все плохо: помимо показанных на картинке вариантов, можно запросто вспомнить еще с десяток, и не факт, что производитель не решил использовать нечто эксклюзивное, у чего может вообще не быть названия.
Маркировка
Допустим, тебе повезло найти чип с памятью. Первым делом нам нужно прочитать его маркировку.
Если маркировка есть — немал шанс встретить ее именно в таком формате, как показан на картинке выше. Первые две буквы — код вендора, потом тип памяти в чипе, потом внутренний номер серии — и дальше уже четкой логики не прослеживается.
Так как единого стандарта нет и не предвидится, производители вольны писать на своих чипах, что считают нужным. Это порой приводит к коллизиям, вроде того, что представлено на той же картинке: два чипа разных производителей, оба 29-й серии, но один NOR, а другой — NAND. Короче, не угадаешь, и такие чипы приходится пробивать в поисковиках, чтобы выяснить хоть что‑то.
Типовой дизайн
Устройства одного сегмента проектируются очень похожими — это вполне очевидно. Например, все бытовые роутеры изнутри выглядят почти одинаково. Та же ситуация на рынке устройств SCADA, у которых свои каноны, но они прослеживаются везде без особых изменений.
Я расскажу о пяти категориях устройств, с которыми тебе, возможно, придется иметь дело:
Само собой, мир крутится не только вокруг смартфонов да компьютеров, но с ними у тебя шанс встретиться куда больше, чем с каким‑нибудь контроллером для управления ракетными двигателями. Поэтому давай рассмотрим типовое устройство только этих пяти категорий девайсов.
Устройство обычных ПК подразумевает модульность, то есть почти все детали можно легко вынуть. Из‑за этого на матплате из элементов памяти есть только флешка с BIOS/UEFI. При этом BIOS обычно сидит на микросхемах 24-й серии — I2C EEPROM, а в новых моделях стоит 25-я серия SPI NOR flash с UEFI.
Если же установлен взрослый интеловский процессор с поддержкой ME — на плате можно найти вторую такую же флешку, но с прошивкой для ME. Это делается в целях безопасности: находящуюся на физически отдельной микросхеме прошивку заразить или подменить сложнее.
Intel Management Engine — это особая система для UEFI-совместимых ПК на базе процессоров Intel. Она имеет свою выделенную микросхему памяти и собственный процессор, а также собственные каналы доступа к сетевым адаптерам и основной оперативной памяти. Может без ограничений взаимодействовать почти с чем угодно в составе компьютера, что очень сильно повышает требования к ее защите.
Бытовые роутеры
С роутерами потребительского класса все довольно просто: тут ставят память SPI NOR 25-й серии, если требуется не больше 8 Мбайт, или NAND-память объемом побольше. Изредка можно найти eMMC, но мне такое пока не попадалось.
Устройства для ответственного применения
Тут все немного сложнее. Стандарты требуют странных вещей, поэтому с большим шансом устройства этой категории будут состоять из нескольких плат, соединенных переходными интерфейсами. Будет много разных запоминающих устройств, чтобы просто пройти сертификацию.
Логи обычно пишутся в EEPROM или FRAM 24-й серии, загрузчик лежит на NOR 25-й серии, а все встроенное ПО кладут на NOR 26-й, 29-й серии. N AND используют редко, а если используют — сразу большими массивами с резервированием.
IoT
Сейчас понятие IoT слишком растяжимое: по сути, туда можно записать вообще все умное домашнее и даже не очень домашнее. Из‑за этого память там может быть любая: хоть EEPROM, хоть eMMC — это когда NAND с хост‑контроллером упакованы в один чип.
Смартфоны
В смартфонах обычно все самое передовое: тут тебе и eMMC, и eUFS, и даже NVMe SSD, как у Apple. При этом, как ни крути, все эти чипы выглядят плюс‑минус одинаково, так что ты их ни с чем не спутаешь.
Осмотр платы устройства
Если вскрытие не показало, что пациент умер от вскрытия, я сначала осматриваю плату в поисках пинов отладочных интерфейсов — обычно это JTAG или UART. Главная проблема не в том, что нужные контакты могут быть в очень неожиданных местах, а в том, что обычно они отключены. Конечно, даже в 2021 году все еще хватает уникумов, которые отправляют в прод устройства с включенным UART, но количество таковых стремительно падает.
Если тебе не повезло — вариантов немного: или плакать в подушку, или искать чип памяти на борту и читать его непосредственно.
И вот с этим тебя ожидает уйма интересного! Думал, нужно просто вытащить восьминогую микруху в DIP-корпусе, похожую на старый чип с BIOS? Как бы не так! Сейчас есть минимум четыре относительно широко применяемых вида памяти, и некоторые из них могут быть похожи друг на друга так, что не различишь.
Изучение платы устройства
После вскрытия устройства нас будет интересовать только его электронная плата.
Поиск информации в интернете
Часто на печатной плате устройства пишут ее номер или название, можно нагуглить по ним схему с описанием всех интерфейсов и пропустить сразу несколько этапов тестирования, которые проводятся, чтобы определить протоколы.
Ищем информацию о чипах
Кроме названия платы, следует найти и записать наименования всех чипов на ней. После этого нужно погуглить их назначение и поддерживаемые интерфейсы.
На фото ниже показан пример найденной технической спецификации чипа STM32F207: в этом документе приведены подробные описания предназначения каждого из контактов микросхемы.
Изучаем разъемы
Если на видном месте платы расположены разъемы, вероятнее всего разработчики девайса предполагали, что они будут как-то задействованы. Нужно помнить, что некоторые из портов устройства могут также использоваться как отладочные.
Так, у многих видеокамер разъем Ethernet используется еще и в режиме Power Over Ethernet (PoE). Если это ваш случай, то советую приобрести специальные разветвители.
Кроме того, у некоторых устройств этот порт может использоваться как RS-232, о котором я расскажу чуть позже. Для таких случаев подойдет другой специальный проводок.
Обратите внимание: если на плате нашелся подходящий разъем, не факт, что переходник к нему идеально подойдет, ведь есть несколько стандартов распиновки.
Разъемы USB на платах умных устройств встречаются реже, и предназначены они преимущественно для подключения цифровых накопителей. Иногда такой порт может использоваться как отладочный, например на смартфонах с Android.
Разъемы RS-232 чаще всего встречаются на промышленном оборудовании и нужны для решения задач администрирования. Переходники для таких разъемов продаются на каждом углу.
Поиск документации
Гуглить, думаю, ты и сам умеешь, но для поиска документации ко всяким экзотическим чипам это может быть бесполезно. Во‑первых, более эффективен поиск по первым N символам названия микросхемы. Во‑вторых, часто проще найти по коду на Aliexpress или других крупных торговых площадках.
Если уж любишь Google, попробуй поиск по картинкам — там порой можно найти то, что текстом не ищется.
Еще огромные базы чипов есть в ПО для программаторов — я использую ПО компании Elnec. Зачастую там даже есть даташиты, но слишком на это надеяться не стоит.
И еще одно хорошее место для поисков — GitHub. С большим шансом там найдется что‑нибудь по запросу в духе «X microcircuit read poc». Дальше можно выдрать ссылку на даташит или что‑то еще полезное. Мне попадались даже скрытые сервисные команды для блокировки/разблокировки чипа, что, конечно, очень приятно при изучении.
Разбираем устройство
Скорее всего, многие читатели решат пропустить эту часть статьи. Именно так я бы и поступил несколько месяцев назад, но оказалось, что в этой теме есть множество нюансов, знание которых может заметно облегчить жизнь начинающему исследователю.
Винты
Чтобы максимально усложнить задачу любителям покопаться в потрохах электронных устройств, их производители напридумывали огромное количество специальных винтов самой причудливой формы.
И не зря: в случае чего придется вскрывать устройство другими методами, в результате мы можем повредить плату и добровольно избавить разработчика гаджета от грустной обязанности выполнять гарантийные обязательства. На иллюстрации ниже показан классический пример нераскручиваемого винта.
А вот так выглядит концепт «безопасного» винта Apple.
Чтобы быть максимально готовым к подобным сюрпризам, вам нужно заранее закупиться набором отверток с необходимыми переходниками. Не буду рекламировать решения конкретных производителей (тем более, они не платят за это денег), но наборы, специально предназначенные для разборки мобильных устройств, в среднем стоят около шестидесяти баксов.
Однако даже самый крутой набор отверток не гарантирует стопроцентного успеха. На практике мне попадались устройства с нормальными винтами, при откручивании которых внутри корпуса ломалась пластмассовая часть с внутренней винтовой резьбой. Поэтому очень важно обращаться с хрупкими девайсами аккуратно, используя отвертки руками, растущими строго из нужного места.
Сторонние материалы на плате
Думаю, вы наверняка в детстве из любопытства разбирали электронику и изучали платы разных устройств. Очень часто на ней обнаруживалась странная черная «клякса» — примерно такая, как на картинке ниже.
Она называется «компаунд». Если сказать проще, это отвердевшая полимерная смола с некоторыми добавками. Используется она преимущественно как электроизоляционный материал и иногда может мешать подключиться к определенным контактам на плате. Примем за основу компаунда эпоксидную смолу, как самый популярный тип.
Если вы поищите по форумам советы о том, чем ее убрать, то найдете много разных способов для самых различных случаев. Бессмысленно перечислять их все, подскажу только самый проверенный: нагревать верхние слои смолы и удалять. Это, конечно, не так красиво, как растворение, но зато почти всегда работает!
Кроме того стоит упомянуть, что на китайских платах иногда может встретиться прозрачный клей. Он легко удаляется, поэтому не будем на нем останавливаться.
Защита от вскрытия
На практике другие методы защиты от вскрытия встречаются крайне редко. В специализированной литературе мне попадались упоминания о наличии специальных клипс, после вскрытия которых устройство уже будет нецелесообразно изучать. Так вот, это настолько диковинный способ защиты, что я даже не могу предложить пример такого устройства. Если вам попадалось что-то подобное, обязательно поделитесь своим опытом в комментариях.
Расшифровка имени
Теперь, когда нашли нужный чип и прочитали маркировку, ее нужно декодировать. Кстати, маркировка далеко не всегда читается целиком: часть может быть случайно или намеренно скрыта, а то и вовсе подделана, как любят устраивать китайцы со своими деталями на Али.
Особо крупные производители могут предоставлять на своих сайтах декодеры имени микросхемы, но почти никто так не делает.
Похвальный пример — производитель Micron, который дал на сайте внятную инструкцию и форму для получения даташита на свои микросхемы.
Если же декодера нет, придется выкручиваться. Можно попробовать разобраться по схеме на скриншоте ниже, но, естественно, безо всяких гарантий успеха. Возможно, даже лучше сразу идти к японцам — они очень любят неадекватно запутанные названия без известной логики. Она, конечно, есть, но пока что никто ее не смог понять.
Взаимодействие с интерфейсами
UART — один из наиболее часто встречающихся отладочных протоколов. В зависимости от платы и прошивки устройства он позволяет общаться с загрузчиком и терминалом операционной системы.
Протокол использует минимум два обязательных пина: RX — приемник, TX — передатчик — и два необязательных: GND — земля, VCC — напряжение. Чаще всего на плате потребуется искать четыре сгруппированных пина.
Для работы с Serial-консолью устройства понадобится соответствующая программа. В Unix-based-системах лучше всего использовать minicom, а в Windows — Realterm.
После загрузки программы вам потребуется вручную подключать пины RX, и если не получится, то еще и GND, пока на экране при включении устройства не появится периодически прерывающийся (это важно!) поток байтов. Затем остается лишь подобрать частоту передачи данных, чтобы на экране вместо потока нечитабельных символов появились читабельные. Самые популярные частоты приведены в следующей таблице (первая колонка).
Подобрать частоту можно вручную, переключая значения в самой программе, а можно с использованием популярного скрипта на питоне baudrate.py.
Для работы с протоколом UART используются специальные переходники, например позволяющие подключиться к разъему USB.
Переходник с USB на COM-порт тоже можно приспособить в качестве переходника USB — UART, достаточно использовать только контакты RD, TD и Ground.
Вот как выглядит переходник для UART, переделанный из переходника USB — RS-232.
А еще в качестве переходника UART — USB можно использовать Arduino Uno. Для этого следует закоротить контакты Reset и GND.
Как вариант, можно приобрести плату Bus Pirate, которая позволяет решать целый спектр задач, но сейчас мы поговорим о ее использовании в качестве переходника USB — TTL.
Для перевода платы в режим переходника потребуется подключить ее к компьютеру и, используя Realterm/minicom (о которых я рассказывал ранее) на частоте 115 200 начать общаться с командной строкой устройства.
Не будем вдаваться в подробности настройки этого девайса. Листинг общения во время переключения платы в режим переходника предоставлен на картинке ниже.
А теперь настало время снова вспомнить про девайс под названием JTAGulator. Хоть изначально он создавался не для этого, JTAGulator все же можно приспособить в качестве переходника USB — TTL. Для этого аналогично Bus Pirate требуется подключиться к консоли управления устройством и вбить команды, показанные на следующей иллюстрации.
Перед тем как приступить к творческим экспериментам, проверьте все пины мультиметром на отсутствие высокого напряжения, иначе велик шанс спалить такие устройства, как Arduino и USB — UART. На удивление, на моей практике именно переходники USB — Serial показали себя с лучшей стороны и ни разу не сгорели во время тестирования плат.
JTAG — это название рабочей группы по разработке стандарта IEEE 1449, но многие ассоциируют его с названием отладочного интерфейса. Доступ к этому интерфейсу в большинстве случаев дает нам неограниченный контроль над устройством, например возможность сдампить его прошивку. Чаще всего для работы с JTAG используется система отладки для микроконтроллеров — OpenOCD.
У этого интерфейса есть четыре обязательных рабочих пина: TDI (сигнал данных на вход), TDO (сигнал данных на выход), TCK (тактовая частота), TMS (выбор режима тестирования) — и один необязательный — TRST (TestReset).
Чаще всего контакты на плате группируются с другими в одну-две дорожки, поэтому поиск нужных пинов осложняется. Способы определить, за что отвечает каждый порт, указывались ранее, а сейчас мы рассмотрим примеры общения с устройствами по интерфейсу JTAG.
Сергей Поделкин уже подробно описал использование Arduino в качестве программатора для некоторых чипов, поэтому настоятельно советую вам ознакомиться с его статьей «Превращаем Arduino в полноценный AVRISP программатор». От себя добавлю, что проектов для Arduino существует множество, и если вам вдруг понадобился программатор для определенной архитектуры, то ищите информацию в интернете — скорее всего, кто-то уже его реализовал.
Если мы уже знаем, за что отвечает каждый пин, и у нас есть плата JTAGulator, можно переключить ее в режим совместимости с OpenOCD и заставить работать как переходник.
Один из дешевых и многофункциональных программаторов, позволяющих работать с большим количеством различных процессоров и совместимых с OpenOCD, называется J-Link. Обойдется он примерно в 5000 рублей.
Напоследок стоит упомянуть о возможности работы с интерфейсом JTAG с использованием платы Bus Pirate и ПО OpenOCD. Подробно настройка устройства описана в статье Gonemad’s Bus Pirate/OpenOCD walk through.
I2C
Этот интерфейс чаще всего используется для общения с памятью EEPROM. Для подключения минимально требуется две дорожки. Рассмотрим способы, позволяющие прослушивать общение.
Активность I2C можно мониторить при помощи Arduino — есть соответствующий проект на GitHub.
Подробный туториал по использованию Bus Pirate можно посмотреть в блоге Digitalpeer.
Существует еще девайс под названием I2CDriver: он предназначен для взаимодействия компьютера с I2C-интерфейсом по каналу USB. Он позволяет не только управлять устройством, но и прослушивать или декодировать его трафик. Сам я пока это приспособление не использовал, но выглядит оно крайне интересно.
SPI
Хоть и нечасто приходится работать с этим интерфейсом, но рассмотреть его надо.
SPI — интерфейс для последовательного обмена данными между микросхемами. Работает он по принципу Master — Slave и использует четыре сигнала: MOSI (от ведущего к ведомому), MISO (от ведомого к ведущему), SCK (тактовый сигнал) и CS (выбор ведомого).
Как всегда, начнем мы с Arduino. Проект под названием spi-dump позволяет использовать этот компьютер для дампа прошивки с SPI EEPROM. Много об этом писать не буду, на GitHub лежит хороший туториал по использованию этой технологии, написанный ее автором.
У Bus Pirate тоже есть функция SPI-сниффера. Настраивается так же, как и I2C.
SWD
Скажу сразу: ни разу не встречал этот интерфейс в устройствах IoT, но, поскольку он широко применяется разработчиками микроконтроллеров, то, вероятнее всего, в скором времени появится и в составе умных устройств. Интерфейс SWD использует тот же протокол, что и JTAG. Для работы ему требуется только три провода: DIO (input-output), CLK и GND.
Пример работы с SWD
После того как мы рассмотрели работу с интерфейсами, разберемся, чем же нам это поможет при тестировании умного девайса.
Извлечение прошивки камеры
Для эксперимента я использовал камеру с незатейливым названием WiFi Smart Camera. Это очень симпатичный девайс, внешне похожий на гибрид фена с ночником.
Поскольку камера китайская, открыть ее не составило особого труда, даже без отвертки.
В первую очередь изучим название платы.
Теперь посмотрим на нее с другой стороны.
Наименование платы видно на первой фотографии: IPG-RM-BLK510-0062-S. Гуглим.
Сайт 121.40.191.139:81 на момент написания статьи был отключен, поэтому воспользуемся кешем Google.
В первой колонке таблицы перечислены названия контактных площадок на плате, во второй — номера контактов, в третьей и четвертой — их описание и предназначение.
Быстро просматриваем табличку в поисках интересных интерфейсов и обнаруживаем, что у площадки J10 вынесены порты UART.
Находим ее на плате.
Количество пинов совпадает, нумерация есть. Дело за малым! Подключаем Arduino к пинам GND (земля), UART0_TXD (отправка) и UART0_RXD (прием).
Включаем программу для работы с Serial-устройствами: в моем случае это IONinja, перезапускаем устройство и зажимаем Ctrl + C на клавиатуре для входа в консоль загрузчика U-Boot.
Получить рутовую консоль не удалось, так что перейдем к следующему пункту. У нас есть возможность использовать команды cramfsls и cramfsload. Попробуем сдампить файлик с именами пользователей и паролями.
Вот мы и получили первый зашитый пароль в камере:
На одном из форумов находим уже декодированный хеш.
Итак, мы получили пароль root:
. С этим разобрались, вернемся к первой фотографии платы.
Красным отмечен чип памяти EEPROM с контактной площадкой SOP8. На нем написано его название: 25L6433F. Погуглив, определяем, что общение идет по SPI, а также находим распиновку микросхемы.
Считать содержимое чипа напрямую с платы не получилось. Придется выпаивать.
Подключаем извлеченную при помощи паяльника микросхему к программатору.
Записываем дамп, припаиваем чип обратно и удостоверимся, что в сохраненном файле есть то, что нам требуется. Для этого воспользуемся утилитой binwalk.
Посмотрим, что получилось распаковать.
Вот мы и получили все файлы с этого устройства!
Контакты микросхем
Для работы с аппаратными интерфейсами требуется сначала определить их наличие и расположение на микросхеме. Для этого рассмотрим восемь самых распространенных вариантов их размещения.
Внимательно посмотрите на следующую фотографию платы.
Видите вот эти контакты?
Почти со стопроцентной уверенностью утверждаю, что какие-то из них будут отвечать за отладку устройства по определенному интерфейсу, а может, даже и нескольким. Для подключения к этим пинам придется воспользоваться паяльником.
Также у некоторых устройств подобные контакты могут быть хорошо спрятаны.
А вот другой пример. Посмотрите на картинку.
Некоторые контакты представляют собой сквозные отверстия с металлизацией. Для подключения к ним можно использовать стандартные пины, например для Arduino UNO. Но нужно учитывать ширину штырьков, иначе есть шанс повредить плату при подключении.
А вот еще один пример.
Если пины от Arduino не подойдут, можно использовать следующий метод. Берем провод с разъемом, показанным на следующем рисунке, — похожие разъемы часто используются для подключения индикаторов и управляющих кнопок к материнской плате компьютера. Удаляем пластмассовую оболочку, затем корректируем размер клеммы плоскогубцами и оборачиваем ее изолентой, чтобы избежать контакта с соседними пинами.
У устройства, показанного на следующей иллюстрации, отладочный разъем был смонтирован отдельно для удобства подключения. Лучше всего тут воспользоваться паяльником и вывести все нужные контакты на отдельные проводки.
Рассмотрим еще один пример.
На многослойных печатных платах встречаются участки, наводящие на мысли о том, что там могли отломать какую-то лишнюю деталь. В данном случае есть шанс, что отладочные пины были выведены на отдельную плату, которую при выпуске продукта удалили. Подробно рассматривать этот случай мы не будем, скажу только, что возможность подключения к таким контактам сильно зависит от архитектуры платы устройства, поскольку всегда остается шанс случайно повредить остальные элементы.
Если вы найдете в интернете схему распиновки какого-нибудь чипа, можно подключиться к нему напрямую, примерно так, как это показано на фото выше. Правда, для этого нужно уметь хорошо паять.
Некоторые пины могут быть спрятаны припойным покрытием — такой вариант показан на следующей картинке. Но опять же подобное встречается крайне редко.
Исследователь Деннис Гис (Dennis Giese) на DEFCON 26 рассказывал (PDF) про безопасность устройств Xiaomi. Во время изучения платы одного из гаджетов производства этой компании он столкнулся с тем, что контактная площадка чипов находилось точно под ними, из-за чего не было никакой возможности подключиться к ним без пайки.
Но позже он заметил на плате контактные дорожки, идущие к другому чипу. После этого Деннису потребовалось немного времени для поиска datasheet этой микросхемы.
Таким образом он смог определить, что эти контактные дорожки отвечают за общение чипа с RAM. Осталось лишь подключиться к дорожкам и сдампить прошивку.
В завершение
На этом статья, посвященная дампу прошивки и доступ к консоли управления устройства, заканчивается. Многое в ней не было затронуто, а по некоторым из ее частей можно написать отдельные статьи для подробного рассмотрения всевозможных случаев. Тем не менее, надеюсь, этот материал поможет вам изучить внутреннее устройство окружающих нас умных гаджетов.
(16 оценок, среднее: 5,00 из 5)
Полезная нагрузка
Используя обнаруженные ранее интерфейсы, мы постараемся получить исчерпывающую информацию о устройстве — версию ПО, исходники, доступ в консоль управления и прочее.
Посредством UART чаще всего мы сможем общаться с загрузчиком операционной системы. Так как возможности интерфейса командной строки загрузчика ограничиваются требованиями разработчиков платы, мы не сможем изучить все случаи, поэтому будут рассмотрены два отдельных варианта с разными загрузчиками: Universal Boot Loader (U-Boot) и Common Firmware Environment (CFE).
Чтобы подключиться к загрузчикам, мы воспользуемся одной из программ для работы с Serial-устройствами — Minicom или Realterm. Частоту передачи данных мы уже определили на предыдущих этапах исследования. Также для активации консоли может потребоваться зажать Ctrl + C или другие комбинации клавиш, поэтому придется следить за сообщениями, появляющимися на экране.
Если вы используете U-Boot, после подключения к консоли можно посмотреть список доступных команд, набрав на клавиатуре волшебное слово help.
В этом примере нас интересуют три команды:
,
и
. Используя команду cramfsls, мы можем получить список файлов в файловой системе устройства.
Далее выбираем нужный нам файл (пусть будет /etc/hosts) и считываем его командой
.
В ответ мы получим сообщение, что по адресу
во флеш-памяти записан наш файл. Прочитаем его командой
(memory display).
В дальнейшем этот процесс можно автоматизировать, например при помощи библиотеки PySerial.
В случае с загрузчиком CFE меняется только последовательность вводимых команд.
Для начала посмотрим список подключенных устройств с помощью команды
.
Попробуем прочитать 100 байт с устройства nflash1.nvram.
После этого нам остается лишь прочитать флеш-память по адресу
.
И, аналогично случаю с U-Boot, можно автоматизировать процесс чтения памяти при помощи PySerial.
В зависимости от конфигурации загрузчика иногда вместо того, чтобы тратить время на получение дампа памяти по UART (бывало, 15 Мбайт скачивались всю ночь), можно отправить их по протоколу TFTP или записать на microSD.
При работе с JTAG очень важно определиться, какое ПО может взаимодействовать с этим интерфейсом. Сейчас я расскажу, как получить дамп прошивки, используя сборку OpenOCD + Bus Pirate.
Нам потребуется программа OpenOCD и настроенная конфигурация для Bus Pirate, которая доступна в репозитории Proxmark.
Для начала запустим OpenOCD с нашим конфигом.
Теперь останется только подключиться к поднятому нами сервису на порте 4444, который указан в конфиге, и ввести пару команд.
И в этой же директории мы обнаружим файлик backup.bin с прошивкой устройства.
Процесс занял всего 246 секунд, и прошивка уже у нас!
Преимущественно нас будет интересовать использование этих интерфейсов у чипов энергонезависимой памяти EEPROM. Отмечу сразу, что Arduino — не лучшее оборудование для работы с памятью, но считаю, что использовать его все-таки можно.
Для Arduino имеется как минимум два проекта по дампу прошивки чипов I2C/SPI: arduino-i2c-read-eeprom и spi-dump.
Не советую пользоваться этими разработками новичкам, так как при некорректном подключении устройства к пинам можно запросто его сжечь.
Отдельно хочу рассказать о программаторе tl866plus, который может работать с EPROM, EEPROM, FLASH, SPI, I2C,93Cxx, ICSP и другими чипами. По сравнению с другим аналогичным оборудованием стоит он копейки.
ПО для tl866plus есть только под Windows, но, если вы используете другую ОС, оно хорошо заработает в виртуалке, и проблем с пробросом устройства быть не должно. Также для этого программатора есть наборы переходников, позволяющих подключать к нему разные чипы.
Мы рассмотрим считывание прошивки с JTAGulator без пайки, с использованием прищепки для SOP8.
Сразу оговорюсь: во время работы JTAGulator находился в ждущем режиме и был запитан по USB, поскольку программатор не справлялся с обеспечением питания для всей платы устройства. Чтобы девайс не проявлял активность в процессе дампа прошивки, лучше всего зажать на чипе пин Reset.
Начнем с запуска ПО для работы с TL866 — Xpro. Ниже показан скриншот интерфейса программы.
На фотографии ниже отмечен чип памяти, смонтированный на плате JTAGulator, — у меня это 24LC5121.
Выбираем его в программе.
Далее подключаем к памяти клипсу зажима (как на фото).
Нажимаем на кнопку Chip read и получаем дамп прошивки JTAGulator.
Получение root-консоли
Если у вас по какой-то причине не получилось сдампить прошивку, можно попробовать получить доступ к админской консоли управления по интерфейсу UART.
Аргументы запуска
И в загрузчике U-Boot, и в CFE есть возможность как считывать, так и записывать глобальные переменные с помощью команд
и
.
Для начала посмотрим, какие переменные были установлены разработчиками.
Нас должна заинтересовать переменная аргументов запуска bootargs:
Для получения рутового доступа можно попробовать дописать в аргументы запуска путь до Bash/BusyBox, чтобы обеспечить автозапуск рутовой консоли при старте системы. Для этого в консоль требуется ввести одну из следующих команд:
= /==/=///= /==/=///= /==/=///=/
Этот метод срабатывает нечасто. Советую посмотреть презентацию компании Synack на DEFCON 23, где были протестированы четырнадцать устройств и к двенадцати из них получены рутовые консоли именно таким методом.
Подмена прошивки
Подменить прошивку устройства с помощью TFTP можно только при наличии порта Ethernet. В переменных окружения потребуется ввести команду
и указать настройки сети.
Теперь нужно поднять сервер TFTP, поместить в его папку файл прошивки и загрузить этот файл на устройство командой
.
Другой метод заключается в сохранении прошивки на SD-карточку с последующей ее загрузкой. Для этого можно использовать команды
и
.
Команда
нужна для инициализации карточки, а
— для загрузки файла с карточки во флеш-память. Подробнее эта процедура описана в вики OpenMoko.
Используя команду
(memory write), вы можете записывать байты напрямую во флеш-память. Но этот процесс требует автоматизации, поскольку запись в случае разных значений байтов будет идти со скоростью четыре байта за один цикл выполнения команды
. Синтаксис команды имеет следующий вид.
Ниже показан пример использования этой команды.
Метод швейной иглы
Этому способу было посвящено выступление «pin2pwn — How to Root anEmbedded Linux Box with a Sewing Needle» на конференции DEFCON 24.
Суть хака заключалась в том, чтобы закоротить соответствующие пины на чтение во время загрузки девайса и тем самым вызвать исключение у скрипта автозагрузки, которое выкинет нас в рутовую консоль.
Внимание! Есть шанс сжечь память устройства, так что используйте этот метод осторожно.
На этой радостной ноте с теорией мы, пожалуй, закончим и перейдем к практике. Нам предстоит решить увлекательную задачу: извлечь прошивку из IP-камеры. Не переключайтесь.
Подготовка к чтению прошивки
После выпайки ни в коем случае нельзя устраивать микросхеме температурные испытания: пусть полежит и остынет сама, а не в спирте — так шансы сохранить работоспособность куда выше. Дальше нужно проверить, все ли лапки чипа находятся в одной плоскости и не образовались ли от припоя перемычки между ножками. Их нужно убрать, чтобы не спалить программатор, не имеющий защиты от такого, и сам чип тоже.
С BGA нужно убрать старый припой и нанести новые шарики. Когда чип очищен и подготовлен к чтению, не вздумай пихать его в программатор с прижимом прямо в чип — велик шанс просто раздавить его!