Дамп прошивки: Разница между дампом и прошивкой — Вопросы по прошивке ресиверов

Содержание

Цифровое телевидение Как из дампа MStar сделать USB-прошивку

Напомню, что теперь даже ребенок, не вскрывая, может выполнить Сохранение дампа флеш-памяти приставок на MStar. Это готовый дамп — для программатора.

И также из дампа легко сделать файл для аварийного восстановления (а точнее автоматического обновления прошивки) — flash.bin. Подробно рассказано в конце: Восстановление приставки на MStar после неудачной прошивки.

Но — реагировать или нет на flash.bin — определяется текущей прошивкой, находящейся в приставке.
Если в ней изначально отключена реакция на flash.bin, то этот файл будет проигнорирован.


Некоторые пользователи (например, прошившие чужой прошивкой приставку и при этом она загрузилась) хотели бы иметь возможность не искать программатор, выпаивать флеш-память, прошивать дамп и запаивать обратно, а попробовать — из уже имеющегося дампа — сделать обычную прошивку для USB.

Кроме того, USB-прошивку можно заливать не только через меню, но и подключившись к UART процессора, ведь у многих, чужая прошивка приводит к тому, что приставка уже не загружается до конца, останавливаясь на заставке.

Ранее о формировании USB-прошивки в общих чертах уже не раз было рассказано. Да и многие давным-давно всё это умели и умеют.

На первый взгляд может показываться, что всё очень сложно, потому что так много всего написано, но на самом деле — всё легко, и это можно сделать буквально за 15 минут. И описать в 3 предложениях.

Просто это своего рода — Инструкция, поэтому всё так подробно, с картинками и примерами.

Сначала будет рассмотрено воссоздание USB-прошивки для процессоров MSD, как наиболее известное:

Структура USB-прошивки для MSD:

• Заголовок, 4096 байт.
• Данные.
• Контрольная сумма Заголовка + Данные, CRC32 (4 байта, в обратном порядке).

А во второй части — для новых процессоров MSA, но действия примерно те же, вплоть до парадоксальных (на осознание несуразности которых ушло время).

Для всего этого потребуется любой HEX-редактор.


Итак, в чём особенность приставок на процессоре MStar: файл USB-прошивки имеет Заголовок, в котором находится загрузочный скрипт, содержащий команды для загрузки прошивки в приставку.

Все эти команды хранятся в обычном текстовом виде.

Сразу подчёркнуты самые важные 3 числа (а 4 = 3), которые и предстоит найти.

Например, 323b7cобъём Данных (это без учёта 0x1000 (4096) байт Заголовка и 4 байт CRC32).

или всё тоже самое в более привычном для чтения виде:

cusid 169b 3b 1 SMC_U01 0x0CFF 1244054
spi_wrc 0x80001000 0

323b7c
setenv usb_complete 1
setenv usb_upgrade 0
setenv bootcmd ‘ spi_rdc 0x80b00000 0x7001c 0x2b3b60; LzmaDec 0x80b00000 0x2b3b60 0x80000180 0x81000000; go 0x80000224;
saveenv
reset

Вот примерно подобное и надо создать, но только уже без первой строки cusid (поэтому и перечеркнуто).

cusid — команда проверки «свой-чужой», поэтому лучше воссоздать USB-прошивку уже без неё.

Проблема восстановления в том, что после исполнения загрузочного скрипта, Заголовок USB-прошивки — нигде в дампе не сохраняется

.

Поэтому основная задача — воссоздание заголовка для будущей прошивки — из той текстовой информации, которая всё-таки есть в дампе.

Несмотря на то, что заголовок текстовый, создавать его надо только в HEX-редакторе.

В конце дампов процессоров MSD/MSA можно увидеть текстовые данные — это переменные окружения.

Искать лучше всего, например, по команде — spi_rdc

Пример переменных в дампе от MSD:

или всё тоже самое в более привычном для чтения виде:

bootdelay=0
baudrate=115200
preboot=echo;echo Type «help» for more commands.
MS_BOARD=BD_MST204A_D01A_S

stdin=serial
stdout=serial
stderr=serial
logo_cmd=boot_logo 0 0 1 1
bootcmd=usb exit;spi_rdc 0x80B00000 0x5001C 0x2DE303; LzmaDec 0x80B00000 0x2DE303 0x80000180 0x81000000; go 0x80000224;
info_exchange=spi
CUSTOMER_OUI=0x169B
AP_SW_MODEL=0x0001
AP_SW_VERSION=0x0001
HW_MODEL=0x0001
HW_VERSION=0x0001

Выделенные числа как раз и являются одними из важных для заголовка. Но тут нет самого 1 числа — объёма Данных.

Раньше получить 1 было очень просто:

2 + 3 (например, как видно у заголовка в самом начале).

Но в современных прошивках стали добавлять ещё какой-то дополнительный блок данных, связанный с сетевыми приложениями.

И если повезёт, то среди переменных окружения будет готовая — общая длина файла будущей USB-прошивки:

filesize

Например, filesize=336DF8 (это уже с учётом 0x1000 (4096) байт Заголовка + 4 байта Контрольной суммы).

И, соответственно, разыскиваемый нами объём блока Данных [1] = filesize–0x1000–4

Но наличие переменной filesize большая редкость, поэтому придётся прикинуть просто на глаз примерное окончание блока Данных в дампе,

на собственное усмотрение.

Дамп лучше листать — с конца (не обращая внимание на пустышки с повторяющимися 00, FF или какой-то рыхлый мусор) до тех пор, пока не начнётся плотный поток различных кодов:

В качестве конца блока Данных сам выбрал 36BB2C — теперь это и есть объём блока Данных. А весь остальной выделенный хвост дампа, начиная с 36BB2C — теперь можно и нужно удалить.

При желании можно оставить 00 и побольше (допустим несколько 00-строк), главное, запомнить Смещение (Offset).

Итак, определили все 3 числа, поэтому создаём файл Заголовка длиной 4096 байт и вбиваем в него эти числа:

Пример этого файла заголовка в архиве.

И добавляем заголовок в начало нашего уже обрезанного с конца дампа. Ешё раз напомню:

Структура USB-прошивки для MSD:

• Заголовок, 4096 байт.
• Данные.
• Контрольная сумма Заголовка + Данные, CRC32 (4 байта, записанные в обратном порядке).

У общего файла Заголовка + Данные подсчитываем его контрольную сумму CRC32.

Подсчет можно сделать с помощью одной из программ или же в Интернете, выбрав вариант CRC-32B:

нажимаем кнопку Выберите файл и указываем на подготовленный файл:

и затем внизу нажимаем кнопку Преобразовать файл:

После загрузки подготовленного файла и подсчёта CRC-32 результат будет выглядеть примерно так:

HEX: B8C5126C

Теперь полученные 4 байта: B8 C5 12 6C добавляем к файлу в обратном порядке: 6C 12 C5 B8:

Всё, прошивка готова.




А теперь для процессоров MSA. Напомню, ключевое отличие — Заголовок стал длиной 16384 байта.

Структура USB-прошивки для MSA:

• Заголовок, 16384 байт.
• Данные, выровненные до ближайшего старшего адреса (как правило, до 0x*****000).
• Контрольная сумма Заголовка, CRC32 (4 байта, записанные в обратном порядке).
• 20 нулевых байт (0x00).

Парадокс, над которым пришлось долго ломать голову, в том, что здесь считается Контрольная сумма только Заголовка.

По привычке, пытался подсчитать CRC32 у различных вариантов Заголовка + Данные, но приставка упорно ругалась — Error: CRC error!
Потому что, как оказалось, у прошивок MSA проверяется только целостность Заголовка

.
Видимо, целостность самого блока Данных проверяется позже.

Итак, как и у MSD, в заголовке у MSA — текстовый загрузочный скрипт, но с гораздо бОльшим числом команд и различных переменных.

Сразу отмечу наиболее важные, которые потом и предстоит определить из дампа.

И это всё те же самые — 3 числа:

или всё тоже самое в более привычном для чтения виде:

fatload usb 0 80000000 $(ForceUpgradePath)
spi_wrc 80004000 0 3bc000

setenv usb_complete 1

setenv usb_upgrade 0
setenv OAD_NEED_UPGRADE 0
setenv OAD_TRIGGER_TYPE 0
setenv bootcmd ‘ spi_rdc 0x80b00000 0x39028 0x338f16; LzmaDec 0x80b00000 0x338f16 0x80000180 0x81000000; go 0x80000224;
setenv upgrade_mode null
setenv MstarUpgrade_complete 1
setenv bl_jpd_read_addr 0x01f1c800
setenv bl_jpd_read_size 0x00100000
setenv bl_jpd_write_addr 0x0201c800
setenv bl_jpd_write_size 0x003fc000
setenv bl_jpd_inter_addr 0x02418800
setenv bl_jpd_inter_size 0x00630000
setenv bl_dfb_framebuffer_addr 0x01b28000
setenv ve_buffer_addr 0x02a48800

saveenv
reset

Сразу оговорюсь о последних 8 переменных: во многих официальных прошивках их значения равны 0x00000000, при этом потом уже в дампе — они имеют конкретные значения, т. е. сама прошивка всё равно знает их значения (можно посмотреть и через команду printenv). Поэтому не вижу смысла восстанавливать их значения из дампа. Но кто желает, может вбить точные значения из дампа.

Итак, как обычно, идём в конец дампа или просто через Поиск строки, например, spi_rdc

Находим область с переменными окружения и видим там нужные нам 2 и 3 число:

Также как у MSD, если повезёт, то среди переменных окружения будет готовая — общая длина файла будущей USB-прошивки:

filesize

Например, filesize=3C6018 (это уже с учётом 0x4000 (16384) байт Заголовка, 0x4 (4) байт Контрольной суммы и 0x14 (20) нулевых байт).

И тогда, разыскиваемый нами объём блока Данных [1] = filesize–0x4000–0x4–0x14

Но, как уже отмечалось, наличие переменной filesize большая редкость, поэтому также как и с MSD, просматривая с конца дампа, ищем плотный поток различных кодов:

Но, в отличие от MSD, у MSA официальный конец Данных — ближайший старший адрес строки, как правило, оканчивающийся на 0x*****000:

В данном случае, это — 0x3C2000, а весь остальной выделенный хвост, начиная с 0x3C2000 — отбрасываем.

Итак, все 3 числа определили, вбиваем их в файл заголовка длиной 16384 байта:

Пример этого файла заголовка в архиве.

Подсчитываем контрольную сумму CRC32 файла Заголовка. В данном случае — 4D 95 D9 32.

Ещё раз напомню:

Структура USB-прошивки для MSA:

• Заголовок, 16384 байт.
• Данные, выровненные до ближайшего старшего адреса (как правило, до 0x*****000).
• Контрольная сумма Заголовка, CRC32 (4 байта, записанные в обратном порядке).
• 20 нулевых байт (0x00).

Итак, всё собираем вместе: добавляем Заголовок в начало нашего уже обрезанного с конца дампа,
затем сзади добавляем 4 байта CRC32 в обратном порядке (т.е. 32 D9 95 4D ) и ещё 20 нулевых байт.

Т.е. концовка получившийся USB-прошивки выглядит вот так:

Если что-то непонятно в структуре начала и конца USB-прошивок и дампов MSD и MSA, то можно посмотреть на различные заводские прошивки и слитые дампы.


Напомню, что прошивки можно загружать не только в полностью работающую приставку через меню, но и подключившись с помощью любой терминальной программы с обычными параметрами порта 115200 8N1 — через любой преобразователь TTL-RS232 (например, в программаторе Ch441A) — к контактам UART процессора MStar.

В момент включения приставки быстро нажимать, например, Enter и попадём в консоль загрузчика.

Загрузка USB-прошивки процессора MSD:

« MStar »# setenv usb_upgrade_path usb_MSD.bin
« MStar »# setenv usb_upgrade 1
« MStar »# saveenv
« MStar »# reset

Название файла прошивки может быть любым.

Загрузка USB-прошивки процессора MSA:

k5ap# usb start 0
k5ap# fatload usb 0 80000000 usb_MSA.bin
k5ap# spi_wrc 80004000 0 3c2000 (где 3c2000 — длина блока Данных [1] прошивки, видна в заголовке)

offset 0x0, size 0x3C2000
initialization done!
Erasing…
Writing…
Verifying…

k5ap# setenv usb_complete 1
k5ap# setenv usb_upgrade 0
k5ap# setenv upgrade_mode null
k5ap# setenv MstarUpgrade_complete 1
k5ap# saveenv
k5ap# reset

т. е. по сути сделать всё то же самое, что указано в заголовке.

На всякий случай, напомню, что у MSA команда help не работает:

k5ap# help
Unknown command ‘help’ — try ‘help’
k5ap# ?
Unknown command ‘?’ — try ‘help’

Стандартное обновление через меню или же через UART помогает и в тех случаях, когда микросхема флеш-памяти — слишком новая и программатор о ней ещё ничего не знает, дамп не прошивается, приходится пытаться указывать другие какие-то более известные микросхемы и пробовать.
А когда обновляете через приставку, то она об этом типе флеш, естественно, знает.

После любых прошиваний не забудьте — сбросить в заводские настройки.


Все вышеуказанные операции проводить с флешкой, отформатированной FAT32.
Если что-то не получается, пробовать с другой флешкой, отформатированной FAT32.

И как всегда стоит ещё раз напомнить:

ВСЁ, ЧТО ВЫ ДЕЛАЕТЕ СО СВОЕЙ ПРИСТАВКОЙ, ВЫ ДЕЛАЕТЕ НА СВОЙ СТРАХ И РИСК!

Если что-то пойдёт не так и приставка вообще не загрузится, то всегда надо быть готовым обратиться к программатору: Восстановление приставки на MStar после неудачной прошивки.


Офф-топ: О работе приложения IPTV

У новых процессоров MSA среди переменных окружения (printenv) появилась интересная:

IPTV_data_size=23644

Если её там нет, то при запуске приложения IPTV будет ошибка:

get IPTV_data_size Failed!!

и она будет создана автоматически.

А если она уже была, то при запуске IPTV будет показано:

szbuf = 23644

Судя по названию, связана с размером какого-то буфера IPTV, но смущает очень маленький размер.

В любом случае, теперь появилась возможность для экспериментов с размером буфера, заходя в консоль и устанавливая свой размер, например:

k5ap# setenv IPTV_data_size 64000
k5ap# saveenv
k5ap# reset

и при запуске IPTV видно:

==== Memory usage====================
u32PoolSize = 0x95ae40
u32FreeSize = 0x8c4a90
u32LargestFreeBlockSize = 0x8c4a84
max usage = 0x8c4a90
min block free size = 0x0

Start decode DB …Decodesize = 0x8
szbuf = 64000

Причём, например, если у приставки изначально размер IPTV_data_size был 292 байта, то после загрузки плейлиста на 107 каналов стало:

parsing file…
szbuf = 230424

Но когда подставил плейлист уже на 282 канала, то размер буфера так и остался прежним:

szbuf = 230424

Пока сложно сказать однозначно за какой именно буфер IPTV она отвечает. Но тот факт, что IPTV_data_size добавили в переменные окружения, говорит о том, что она действительно важна.

И эта же переменная используется для приложения YouTube:

==== Memory usage====================
u32PoolSize = 0x8ca000
u32FreeSize = 0x836ec0
u32LargestFreeBlockSize = 0x836eb4
max usage = 0x836ec0
min block free size = 0x0

Start decode DB …Decodesize = 0x38534
szbuf = 230708



ObjLoader_init exit
ObjLoader_Demo
object file had loaded !!
FFMPEG VERSION : 3.4.2
eYoutubeCb = 0x7000E
http code:200
szbuf = 230708

5 / 5 ( 7 голосов )

Задать вопросы о цифровом телевидении можно на форуме DVBpro

Автор: Александр Воробьёв, 29 Июн 2019 | Постоянная ссылка на страницу: http://dvbpro. ru/?p=26443

Взлом прошивок USB-устройств | Securelist

В этой статье я хочу продемонстрировать извлечение прошивки из защищенного USB-устройства, работающего на микроконтроллере Cortex M0.

Кто взламывает игровые приставки?

Производство пиратских, нелицензированных изделий — многомиллиардная индустрия и на рынке можно найти аксессуары практически для всех когда-либо вышедших игровых приставок. Здесь и устройства, позволяющие воспроизведение копий лицензионных игр из «бэкапов» с произвольных носителей, и контрафактные геймпады, и различные адаптеры для игровых контроллеров (в том числе дающие преимущество перед другим игроками), и гаджеты для применения читов в офлайн- и онлайн-играх. Разумеется, все эти устройства продаются вопреки желанию производителей игровых приставок.

Игровые консоли, как и двадцать лет назад, представляют собой проприетарные системы, производители которых навязывают свои правила миллионам пользователей: приставка должна исполнять только подписанный код, на ней можно играть только в легально приобретенные (и лицензионные) игры, и только «официальными» аксессуарами. В некоторых странах, взлом собственной приставки является нарушением закона.

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

Защита геймпада DualShock 4

Те читатели, которые следят за моим аккаунтом в Twitter, знают, что я давно увлекаюсь игровыми приставками, их реверсом, а также всем, что связано с консолями, в том числе, неофициальными игровыми устройствами. В первые дни существования PlayStation 4 публично известная уязвимость в ядре FreeBSD, на котором основано ядро этой приставки, позволила мне (и многим другим исследователям) приобщиться к архитектуре и принципам работы консоли Sony. Я провел множество исследований, в том числе, изучил принципы аутентификации игровой периферии и то, как PS4 отличает лицензированные устройства от нелегальных. Ранее я проводил подобные исследования других приставок, и авторизация периферийных устройств у PS4 оказалась хоть и проще чем у Xbox 360, но не менее эффективна.


Схема авторизации USB-аксессуаров PlayStation 4

PS4 посылает 0x100 случайных данных, в ответ на которые DualShock 4 генерирует подпись RSASSA-PSS SHA-256 и присылает её вместе с криптографическими константами N и E (публичный ключ), которые нужны для верификации этой подписи. Эти константы уникальны для каждого выпущенного геймпада. Также геймпад посылает подпись для верификации N и E, алгоритм тот же — RSASSA-PSS SHA-256, но криптографические константы едины для всех приставок и хранятся в ядре приставки.

Таким образом, чтобы авторизовать свое устройство недостаточно взломать ядро приставки — нужно иметь приватный ключ геймпада. И если кто-то всё-таки взломает геймпад и получит его, то у Sony остается возможность заблокировать ключ с обновлением прошивки. Также, если в течении 8 минут приставка не получает авторизационное сообщение от геймпада, то она прекращает «общение» с ним, и чтобы продолжить использование устройства нужно отключить его от консоли и подключить заново. Симуляция этого процесса очень раздражала владельцев первых нелегальных геймпадов.

Слухи о суперподделке DualShock 4

Схему аутентификации DualShock 4 не могли взломать довольно долго. Но в какой-то момент я услышал, что на рынке появились поддельные геймпады, которые выглядят и работают в точности, как оригинальные. Мне захотелось посмотреть на них своими глазами и, оформив несколько заказов на китайских торговых площадках, я стал ждать.

Время ожидания было решено скрасить поиском подробной информации о подделках. После некоторого количества поисковых запросов, я наткнулся на контроллер Gator Claw.


Неавторизированный геймпад Gator Claw

Интересным в нем было то, что, судя по обсуждению контроллера на Reddit, сначала он работал, как и другие неавторизованные геймпады — по 8 минут, но разработчики смогли это исправить в обновлении прошивки. На сайте магазина была доступна ссылка на файл обновления и руководство по его установке, которые я и скачал.


Инструкция по обновлению геймпада Gator Claw

Основы анализа embedded прошивок

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


Прошивка, найденная в ресурсах программы обновления Gator Claw

Читатели, знакомые с программированием embedded-устройств, наверняка узнают этот формат. Это файловый формат Intel HEX который часто применяется для программирования микроконтроллеров и многие компиляторы, например, GNU Compiler, могут выводить скомпилированную программу в таком формате. Также мы можем видеть, что начало этой прошивки не имеет большой энтропии и последовательности байтов легко различимы, что означает отсутствие шифрования или сжатия. После декодирования Intel HEX стрима и загрузки в редактор (010 Editor умеет открывать файлы прямо в таком формате) мы можем взглянуть на прошивку. Что это за архитектура? ARM Cortex-M настолько распространен что я различаю его с первого взгляда.


Прошивка Gator Claw (слева) и векторная таблица ARM Cortex-M (справа)

Согласно спецификации первое двойное слово — это начальная вершина стека, после него идет таблица прерываний. Первое слово в этой таблице — Reset vector, служащий точкой входа. Также можно сразу обратить внимание на верхнюю часть адресов других обработчиков прерываний, что дает нам представление о базовом адресе прошивки.

Помимо этого, в ресурсах был найден файл конфигурации с описанием различных микроконтроллеров. Скорее всего, разработчики программы для обновления задействовали некий общедоступный код от производителя микроконтроллера и наиболее вероятно, что этот файл конфигурации шел вместе с этим публичным кодом.


Файл конфигурации с описанием различных микроконтроллеров

После поиска идентификаторов из файла конфигурации мы находим сайт производителя этих микроконтроллеров – Nuvoton. Продуктовая линейка, техническая документация и SDK свободно доступны на сайте, и, более того, для их скачивания не нужно принимать какое-либо соглашение.


Сайт производителя микроконтроллеров Nuvoton

Благодаря этому у нас есть прошивка, мы знаем архитектуру и производителя микроконтроллера, у нас есть сведения о базовом адресе, вершине стека и точке входа. Доступной информации более чем достаточно, чтобы загрузить прошивку в IDA Pro и приступить к анализу.

В процессорах ARM поддерживаются два режима исполнения кода с различными инструкциями: ARM (32-битные инструкции) и Thumb (16-битные инструкции, дополненные Thumb-2 32-битными инструкциями). Cortex-M0 поддерживает только режим Thumb, поэтому мы установим переключатель в Processor options – Edit ARM architecture options – Set ARM instructions на NO во время загрузки прошивки.

Мы видим, что прошивка хорошо загрузилась по базовому адресу 0, автоматический анализ распознал практически все функции. И теперь встает вопрос – как правильно анализировать прошивки?


Одна из функций, присутствующих в прошивке

Если изучить эту прошивку, то мы увидим, что она совершает большое количество операций чтения и записи к памяти с базовым адресом 0x40000000. Это базовый адрес где находится память, отведенная под ввод-вывод (memory mapped input output — MMIO). Через эти адреса предоставляется доступ ко всем периферийным компонентам, которые есть у микроконтроллера. Все что делает прошивка происходит через доступ к MMIO-регистрам.


Схема адресов периферийных устройств

Найдя в документации адрес 0x40000000 мы узнаем, что этот микроконтроллер серии M451. Зная семейство микроконтроллера, можем скачать SDK и образцы кода для этой платформы. Внутри SDK мы находим заголовочный файл с объявлением всех MMIO-адресов, всех битовых полей и структур. Так же мы можем скомпилировать образцы кода и все библиотеки, а затем сравнить их с функциями в нашей IDB, или мы можем просто искать имена MMIO адресов в исходном коде и сравнивать их с нашим ассемблерным кодом. Это превращает процесс обратной разработки прошивки в простой и легкий процесс. Анализ был бы намного сложнее если бы у нас не было информации об архитектуре и модели микроконтроллера, и MMIO-регистрах. К слову, именно поэтому многие производители делятся SDK только после подписи NDA.


Процесс нахождения библиотечных функций в коде прошивки

Но что по-настоящему заинтересовало меня в этой прошивке — одна неиспользуемая строка с именем крупного производителя электроники (наиболее известного своими логическими анализаторами, но, как оказалось, имеющего и игровое подразделение). Судя по всему, она должны была быть частью USB Device Descriptor, но этот дескриптор не был использован.

В тени гиганта

Мне удалось найти магазин с огромным ассортиментом игровых аксессуаров, продаваемых под единой торговой маркой. Среди продаваемых аксессуаров числились два десятка различных адаптеров для подключения геймпадов одной приставки к другой. К примеру, отдельный продукт для подключения геймпада Xbox 360 к приставке PS4, отдельный продукт для подключения геймпада PS3 к приставке Xbox One, и многие другие, включая «все в одном». Также ассортимент продукции включает адаптеры для подключения клавиатуры и мыши к консолям PS4, Xbox One и Nintendo Switch, различные игровые геймпады и печатные платы для создания своих аркадных контроллеров для приставок. Все продукты шли с обновлениями, аналогичными тому, которое шло с Gator Claw, но с существенным отличием – все прошивки были зашифрованы.


Пример инструкции и зашифрованной прошивки из ресурсов программы обновления к одному из продуктов

Теперь попробуем найти фотографии печатных плат аркадных контроллеров, что позволит оценить схему устройства, не покупая и не разбирая его. Скорее всего их дизайн идентичен дизайну Gator Claw. На найденных фотографиях мы можем видеть два микроконтроллера: один из них должен быть Nuvoton M451, а другой – вспомогательный, для секретов: производители понимают, что конкуренты могут изучить их прошивку, и чтобы предотвратить это используют второй микроконтроллер. Забегая вперед, скажу, что в нашем случае он тоже присутствовал. Данные для аутентификации передаются в него по протоколу I2C и после получения отправляются обратно на приставку.

Поскольку все дорожки идут к микроконтроллеру под черной эпоксидной смолой, мы можем заключить, что это главный микроконтроллер. А микроконтроллер с четырьмя желтыми ножками соответствует требованиям для работы по протоколу I2C и является вспомогательным.


Примеры внутреннего дизайна выпускаемой продукции

Внутри контроллера

К этому моменту я наконец получил посылку из Шэньчжэня, и надо сказать, что контрафактный гаджет очень сложно отличить от оригинального DualShock 4: геймпад выполнен из качественных материалов, touchpad работает, динамик и гарнитура тоже.


Контрафактный DualShock 4 (вид снаружи)

С помощью комбинации клавиш из инструкции я проверил, что геймпад переходит в DFU-режим, и приступил к разборке. Отмечу, что при этом на ПК геймпад определился как другое устройство, с иными идентификаторами и характеристиками.


Контрафактный DualShock 4 (вид на главную плату)

Я припаял провода к отладочным площадкам и подключил программатор. Программатор определил устройство, но security lock был установлен.


Программатор определил микроконтроллер и включенный Security Lock

Метод взлома прошивок USB-устройств

Дизайн USB-протокола определяет две сущности — хост и остальные устройства, которые подключаются к нему. Они, в свою очередь, разделяются на классы: hub, human interface, printer, imaging, mass storage device и другие.


Схема подключения USB устройств

Общение между устройствами и хостом происходит посредством односторонних и двухсторонних каналов. Под каналом мы подразумеваем передачу данных между программой на хосте и конкретным «конечной точкой» на устройстве. Таких точек может быть несколько для передачи различных данных.


Схема типов передачи данных

Существует четыре типа передачи данных:

  • Control Transfers (используется для конфигурации)
  • Bulk Data Transfers (большие количества последовательных данных)
  • Interrupt Data Transfers (используются для своевременной и точной передачи данных)
  • Isochronous Data Transfers (беспрерывный поток данных)

Все USB-устройства должны иметь особый канал на нулевой конечной точке, зарезервированный для конфигурации устройства.

Эти типы передачи данных осуществляются посредством пакетов, представленных на рисунке ниже:


Пакеты, задействованные в протоколе USB

По факту, USB-протокол — это машина состояния, и в этой статье мы не будем останавливаться на каждом из этих пакетов. Ниже представлен пример осуществления Control Transfer:


Control Transfer

Устройства могут содержать уязвимости в каждом из четырех типов передачи данных, но эти типы опциональны, к тому же их наличие и применение будет сильно отличаться от устройства к устройству. Но все устройства поддерживают Control Transfers и формат, по большей части, един для всех устройств, что делает данный тип передачи данных наиболее интересным для анализа на наличие уязвимостей.

Диаграмма ниже изображает формат SETUP-пакета, который используется для выполнения Control Transfer.


Формат SETUP-пакета

SETUP-пакет занимает 8 байт и может предоставлять различные данные в зависимости от типа запроса. Некоторые из них едины для всех устройств (например, дескрипторы), другие зависят от класса устройства или желания производителя. Размер передаваемых/получаемых данных задается 16-битным словом и также передается в SETUP-пакете.


Примеры запросов

Подводя итог: Control Transfers используют простой протокол, поддерживаемый всеми USB-устройствами, которые могут иметь множество дополнительных команд, и мы контролируем размер данных. Все это делает Control Transfers идеальной целью для фаззинга и глитчинга.

Эксплуатация

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


Уязвимый код в обработчике HID реквестов

Функция HID_ClassRequest() написана для симуляции работы оригинального геймпада DualShock 4, и поддерживает минимум необходимых запросов для работы с приставкой PlayStation 4. USBD_GetSetupPacket() получает SETUP-пакет и в зависимости от типа переданного репорта либо получит, либо отправит данные функциями USBD_PrepareCntrlIn() и USBD_PrepareCntrlOut(). Как можно заметить, запрошенный размер данных не проверяется и это должно дать нам возможность читать часть внутренней памяти, где хранится прошивка, а также читать и писать в начало SRAM-памяти.


Переполнение буфера в процессе Control Transfer

Размер DATA-пакета задается в USB Device Descriptor (который также получается с помощью Control Transfer) но, похоже, что остается не учтен тот факт, что этот размер указывает на размер одного пакета, а их может быть сколько угодно в зависимости от размера, заданного в SETUP-пакете.

Примечательно, что образцы кода, размещенные на сайте Nuvoton, также не содержат проверок на размер и могут привести к большему количеству багов в различных проектах из-за копирования этого кода.


Эксплуатация переполнения буфера в SRAM памяти

SRAM (Static random access memory) — это оперативная память, в которой помимо прочего находится стек. Очень часто SRAM также является исполняемой памятью (настраивается), обычно это делается для улучшения производительности – основная прошивка может скопировать в SRAM часто вызываемый код, например, код Real-Time Operating System. Нет гарантий, что вершина стека будет находиться в достижимых пределах переполнения буфера, но вероятность этого велика.

Неожиданно, но главным препятствием на пути к эксплуатации уязвимостей в прошивках USB-устройств являются операционные системы. Нижеперечисленное характерно для Windows, но думаю, что актуально и для Linux-based систем без специальных исправлений.

Во-первых, ОС не позволяет прочесть больше 4 килобайт во время передачи данных Control Transfer. Во-вторых, по моему опыту ОС не позволяет записать больше одного пакета с данными во время Control Transfer. В-третьих, USB-устройство может использовать «скрытые» запросы, которые ОС откажется посылать.

Это легко продемонстрировать на примере устройств HID (Human Interface Device), к которым относится геймпад. У них есть дополнительные дескрипторы: HID Descriptor, Report Descriptor, Physical Descriptor. Второй из списка отличается от каких-либо других дескрипторов и состоит из программных единиц, описывающих доступные репорты. Если запрос не описан в Report Descriptor, то в таком случае ОС откажется его выполнить даже если он обрабатывается в устройстве. Все это противодействует нахождению и эксплуатации уязвимостей.

Чтобы решить эту проблему без необходимости разбираться и перекомпилировать ядро Linux, я воспользовался low end инструментами которые были у меня под рукой: плата Arduino Mega + USB Host Shield (общая стоимость — менее 30 $).


Схема подключения устройств

После подключения устройств по представленной выше схеме, я воспользовался Arduino для выполнения Control Transfer без каких-либо вмешательств со стороны операционной системы.


Arduino Mega + USB Host Shield

Поддельный геймпад содержал те же уязвимости что и Gator Claw, и первое что я сделал — «сдампил» часть прошивки.


«Сдампленная» часть прошивки

Для нахождения базового адреса дампа нашей прошивки достаточно найти структуру с указателями на известные данные. После этого мы можем посчитать дельту и загрузить полученную часть прошивки в IDA Pro.


Структура с указателями на известные данные

Дамп прошивки позволил нам узнать адрес функции printf(), которая выводит в UART информацию, необходимую для контроля качества. Также анализ дампа позволили найти аналог функции hexdump(), что полностью освобождает нас от необходимости написания шеллкода.


Нахождение функций, облегчающих эксплуатацию

После нахождения контактов UART на плате геймпада, припаивания проводов и подключения их к TTL2USB адаптеру мы видим вывод в терминале.


Стандартный UART вывод при включении геймпада

Стандартная библиотека для микроконтроллеров Nuvoton идет с очень удобным обработчиком Hard Fault исключений, который выводит дамп регистров. Это сильно облегчает эксплуатацию и позволяет отлаживать эксплойт.


Вывод в UART при Hard Fault исключении, вызванным перезаписью стека

Финальный эксплойт для дампа прошивки:


Эксплойт и шеллкод для получения дампа прошивки по UART

Но этот способ дампа нельзя считать полноценным, поскольку серия микроконтроллеров Nuvoton M451 позволяет использовать две различные прошивки: основную (APROM) и мини-прошивку для DFU-обновлений (LDROM).


Схема Flash и системной памяти Nuvoton M451 в различных режимах исполнения

Эти прошивки транслируются на одни и те же адреса памяти, поэтому в зависимости от текущего режима можно прочесть только одну из них. Для того, чтобы получить дамп прошивки LDROM, нам нужно отключить security lock и прочитать Flash-память с помощью программатора.


Шеллкод, снимающий security lock

Криптофейл

Изучение прошивки обновлений (LDROM) показало, что это стандартный код от Nuvoton, но с добавленным шифрованием обновлений прошивок.


Схема криптографического алгоритма шифрования обновлений прошивок

Шифрование представляет собой кастомный блочный алгоритм, выполненный в режиме сцепления блоков шифротекста, длина которых составляет всего 32 бита. В этот алгоритм предоставляются ключ, который является текстовым (ASCII) идентификатором продукта, и массив инструкций, которые определяют, какое преобразование сделать с текущим блоком. После достижения конца ключа и массива, их позиция устанавливается на начальную. Список преобразований включает в себя шесть операций: xor, subtraction, subtraction (reverse), и повтор этих преобразований с переустановкой байт. Так как в прошивках присутствуют большие области, состоящие из нулевых байт, это позволяет с легкостью посчитать секретные составляющие этого алгоритма.


Раскрытие ключа шифрования обновления прошивки

Применение алгоритма, извлеченного из прошивки контрафактного геймпада, ко всем прошивкам аксессуаров, доступных на сайте OEM-производителя, показало, что они все используют этот алгоритм шифрования. Это позволяет высчитать ключи шифрования для всех устройств и расшифровать все представленные прошивки. Таким образом, алгоритм, вложенный в контрафактный продукт поставил под угрозу безопасность всех продуктов производителя.

Заключение

Пост получился очень большим, но я хотел подготовить его для наиболее широкой аудитории. В этой статье я продемонстрировал полный процесс анализа embedded-прошивок, поиска и эксплуатации уязвимости для получения дампа, исполнения произвольного кода на USB-устройстве. Хоть глитчинг-атаки не вошли в статью, они тоже очень эффективны при взломе USB-устройств. Для желающих узнать об этом больше рекомендую ознакомиться с этим видео. А тем, кто задался вопросом, как пираты получили ключи и алогритм из DualShock 4, советую почитать этот материал.

Что касается тайны со вспомогательным микроконтроллером, то оказалось, что, во-первых, он присутствует не во всех устройствах, а во-вторых, добавлен всего лишь для запутывания и не хранит никаких секретов, выполняя лишь операции SHA1 и SHA256. Контроллер Nuvoton M451, может быть объектом для дальнейших исследований т.к. во время этого исследования он продемонстрировал некоторые признаки, которые могут свидетельствовать о наличии архитектурных уязвимостей.

Покупателей контрафактных геймпадов не ждет ничего хорошего: Sony заблокирует нелегально используемые ключи, и пользователи останутся без рабочего контроллера.

Восстановление прошивки и сброс пароля с помощью USB UART

Процедура обновления

Обновление устройств XM было рассмотрено в отдельной статье, здесь же я поделюсь дополнительными сведениями, которые могут оказаться полезными при восстановлении, когда что-то пошло не так (отключили свет в процессе обновления, была залита несовместимая прошивка или был другой сбой).


Обновление устройства можно произвести двумя способами: устройство самостоятельно скачивает прошивку и обновляется, или пользователь находит свежую версию, загружает через Web-интерфейс или CMS, и далее обновление идёт по тому же сценарию.
Для минимизации проблем, в прошивке содержится специальный файл-описатель InstallDesc в котором содержится идентификатор платформы «Hardware», по которому устройство проверяет, подходит ли ему загружаемая прошивка, сравнивая его содержимое с файлом ProductDefinition внутри прошивки.
Также есть отдельное поле «Vendor», которое обычно содержит «General».
Поле «Vendor» введено для производителей оборудования, которые помимо собственно сборки, добавляют также дополнительные функции, особые параметры работы или просто меняют заводское распределение памяти. Таким образом, осуществляется простейшая защита копирайта, а также от заливки несовместимой прошивки.
Если совпали оба этих поля, запускается процедура обновления, в противном случае выдаётся сообщение об ошибке.
Прошивка представляет из себя переименованный .zip архив, который содержит несколько .img файлов — разделов дампа со специальным заголовком в 64 байта, а также уже упоминаемый файл-описатель InstallDesc. Пример типового содержимого прошивки:
InstallDesc
u-boot.bin.img
u-boot.env.img
romfs-x.cramfs.img
user-x.cramfs.img
web-x.cramfs.img
custom-x.cramfs.img
У регистраторов ещё есть раздел с логотипом logo-x.cramfs.img
Обновление осуществляется по разделам, поэтому в случае прерывания процедуры обновления, повреждённым оказывается лишь один раздел.
u-boot.bin — это сам загрузчик u-boot, прошивается первым и почти всегда остаётся целым благодаря малым размерам. Помимо процедуры запуска, u-boot содержит также процедуры вывода на экран логотипа (у регистраторов), а также — самое важное — скрипты восстановления модулей прошивки.
Именно поэтому мы и видим на экране сбойного устройства «матрас» или логотип производителя.
Если логотип не пропадает, а устройство не переходит в рабочий режим, значит повреждён один из блоков прошивки, но сам загрузчик цел, и устройство можно относительно просто и недорого восстановить.

При повреждённом загрузчике мы получаем полный «кирпич», описываемый здесь метод уже не применим, восстанавливать придётся на программаторе, в данной статье его рассматривать не будем.

 

Подключаем UART

Общение с загрузчиком производится из консоли командами, которые подаются через специальный отладочный интерфейс — UART. В качестве консоли (терминала) удобнее использовать Putty (Kitty), хотя сгодится даже встроенный в Windows гипертерминал.
Чтобы иметь возможность слать команды из терминала, нам понадобится USB-UART преобразователь.
Самый распространённый — это преобразователь на базе микросхемы Prolific PL-2303HX. Для восстановления одного устройства его будет достаточно, но если вы профессионально занимаетесь ремонтом, лучше приобрести преобразователь на базе микросхемы FTDI FT232R, он более надёжный и не так подвержен помехам в линии.

Подключив UART преобразователь, получим в системе дополнительный последовательный COM порт, номер которого нужно узнать в диспетчере устройств. Этот номер указываем в программе-терминале, а также задаём другие параметры порта: скорость 115200, чётность нет, стоп. бит 1.

Для подключения соединяем минусовой («земляной») провод устройства с общим (GND) проводом преобразователя, RX устройства соединяем с TX преобразователя, а RX, соответственно, с TX.

Включаем устройство и наблюдаем такую картинку:

Это лог загрузки. На короткое мгновение на экране мелькнёт приглашение Press Ctrl+C to stop autoboot. Нужно поймать этот момент и нажать комбинацию клавиш Ctrl+C, после чего мы попадаем в командный интерфейс загрузчика.
Даём команду printenv, это выведет на экран переменные окружения загрузчика и сообщит нам дополнительную информацию о подопытном.

Нас пока интересуют два параметра:
ipaddr=192.168.1.10 — IP адрес устройства
serverip=192. 168.1.107 — IP адрес нашего компьютера
их можно изменить командой setenv или подставить компьютеру IP адрес из serverip на время восстановления.

 

TFTP сервер

Поиграв с командами, вероятно, вы захотите пойти дальше и восстановить устройство.
Для этого нам понадобится ещё одна программа — TFTP сервер, я рекомендую tftpd32.

Устанавливаете его и настраиваете согласно картинке.

Бэкап — наше всё

Теперь подключаем нашу многострадальную камеру/регистратор сетевым кабелем к той же сети, что и компьютер с программой терминала и TFTP сервером, запускаем tftp сервер

Перед экспериментами обязательно нужно сделать резервную копию (дамп). Для этого нужно узнать размер flash памяти устройства. В этом нам поможет команда sf probe 0.

xmtech # sf probe 0
8192 KiB hi_fmc at 0:0 is now current device

Отсюда видно, что размер флеши — 8192кб, что составляет 0x800000h в шестнадцатеричной системе. (Для флеши 16384кб это число будет 0x1000000h).

Ещё понадобится узнать адрес доступной оперативной памяти, чтобы скопировать дамп в память или загрузить туда блоки. Дайте команду printenv и посмотрите переменную bootcmd=. В самом конце всегда присутствует команда bootm и адрес памяти. В нашем случае bootm 0x82000000 (бывают также 0x42000000)

Тогда команды для резервной копии будут такими:

setenv serverip 192.168.1.101 установка IP адреса нашего компьютера (не обязательно, если уже задали ему IP из serverip)
setenv ipaddr 192.168.1.10 изменение IP адреса устройства (не обязательно, если находится в той же подсети, что и комп)
sf probe 0 Обращение к SPI флеши
sf read 0x82000000 0x0 0x800000 Копирование содержимого flash в оперативную память
tftp 0x82000000 dump. bin 0x800000 Передача дампа на tftp сервер

 

После чего в папке tftp сервера появится файл dump.bin, содержащий полную резервную копию.

 

Восстановление

Теперь понадобится файл прошивки под наше устройство. Надеюсь, вы записали номер устройства из окошка Info, когда устройство ещё работало? Если нет, подобрать подходящую прошивку можно по фото устройства, написав комментарий к статье или написав в наш канал в Telegrem.
Скачиваем прошивку, открываем архиватором и извлекаем все файлы в папку tftp сервера (у меня r:\tftp).

Теперь осталось немного, даём в консоли следующие команды:
run dc
run du
run dr
run dw
После чего перезагружаем командой reset.

Обычно это позволяет восстановить работоспособность в случае порчи одного из модулей. Также может понадобится стереть все настройки (см. следующий абзац)
Если файлы не грузятся с tftp сервера (в консоли циклические попытки), то скорее всего мешает брандмауэр Windows — отключите его или добавьте tftpd32 в исключения.

 

Сброс пароля

Бывают ситуации, когда пароль администратора утерян, но нужно получить доступ к устройству с целью изменения его настроек. В этой ситуации тоже поможет преобразователь USB-UART, с той лишь разницей, что в этом случае не требуется tftp сервер.
Повторяем те же действия из раздела «Подключаем UART», включая команду printenv.
Внимательно изучаем её вывод, обратив внимание на содержимое переменной bootargs
В нашем примере это будет вывод от камеры 00018510
bootargs=mem=39M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=cramfs mtdparts=hi_sfc:320K(boot),3520K(romfs),2560K(user),1152K(web),320K(custom),320K(mtd)
320K(boot),3520K(romfs),2560K(user),1152K(web),320K(custom),320K(mtd)
Запускаем калькулятор Windows, переводим его в режим программиста и начинаем подсчёт. Для этого переключаем калькулятор в режим dec, переводим мегабайты и килобайты в байты (килобайты умножаем на 1024, а мегабайты — на 1048576), складываем полученные значение и переключаем калькулятор в режим hex.
Получаем следующие таблички:

Размеры mtd разделов
320K(boot) 327680 50000h
3520K(romfs) 3604480 370000h
2560K(user) 2621440 280000h
1152K(web) 1179648 120000h
320K(custom) 327680 50000h
320K(mtd) 327680 50000h

Адреса mtd разделов
0x000000-0x050000 : "boot"
0x050000-0x3c0000 : "romfs"
0x3c0000-0x640000 : "user"
0x640000-0x760000 : "web"
0x760000-0x7b0000 : "custom"
0x7b0000-0x800000 : "mtd"

Из таблицы нас интересует последний раздел — mtd. Как видно из bootargs, его размер 320кб, что составляет 50000h в шестнадцатеричной системе, а начальный адрес — 0x7b0000.
Здесь хранятся настройки устройства, и, самое важное, пароли пользователей. Если его стереть, то система пересоздаст этот раздел заново с настройками по умолчанию, и, соответственно, с пустыми паролями.

даём следующие команды:
sf probe 0
sf erase 0x7b0000 0x50000
reset

 

В новых прошивках появилась защита флешки от записи, поэтому сразу после sf probe 0 нужно давать ещё команду sf lock 0, чтобы снять защиту.

Внимательный читатель может обратить внимание, что раздел mtd последний, и для его вычисления достаточно вычесть размер mtd 0x50000 из размера флешки 0x800000, получим те же 0x7b0000. Так даже проще, если нас интересует только один раздел.

Хочу ещё раз напомнить, что это только пример, у вас будут другие цифры. Использование неправильных значений обязательно приведёт к порче устройства!

 

Слишком сложно!

Не каждый пользователь осилит установку и настройку tftp сервера, не говоря уж про вычисления размеров и смещений для сброса настроек, поэтому мы разработали удобную программу с дружественным интерфейсом, упрощающую действия пользователя. Программа позволяет производить четыре основных операции:
1. Создание резервной копии (дампа) устройства
2. Восстановление камеры/регистратора из созданного дампа
3. Восстановление устройства с помощью файла прошивки
4. Стирание настроек/сброс пароля
Эти возможности предоставляются бесплатно. К пользователю есть лишь одна просьба — для новых устройств по возможности сделать фото устройства и прислать их вместе со слитым дампом по одному из контактов сайта. Пожертвования автору программы приветствуются.

Программу XMDeviceExplorer можно скачать тут.

Дополнительные видео по ремонту на Youtube.

Что такое прошивка? Определение и типы

Firmware , более известная как программное обеспечение для аппаратного обеспечения ’, представляет собой программу, встроенную в такое оборудование, как клавиатура, жесткий диск, BIOS или видеокарта. Он предназначен для предоставления постоянных инструкций для связи с другими устройствами в системе и выполнения таких функций, как основные задачи ввода/вывода.

Что такое прошивка


Микропрограмма, как и драйверы, выполняет ту же функцию, но отличается тем, что хранится на самом аппаратном устройстве, пока драйверы устанавливаются внутри операционной системы. Кроме того, прошивка может запускаться сама по себе и выполнять то, для чего она запрограммирована или предназначена, в то время как драйверы должны запускаться операционной системой.

Типы прошивок


BIOS

Первое, что оживает после включения компьютера – это BIOS. Он может взаимодействовать с оборудованием и проверять наличие неизвестных ошибок. Затем он сигнализирует о другой программе, называемой загрузчиком, которая выполняет функцию пробуждения операционной системы, спящей внутри жесткого диска, и помещает ее в оперативную память. Таким образом, BIOS несет основную ответственность за обработку аппаратных компонентов вашего компьютера и обеспечение их правильной работы. Хотя низкоуровневое программное обеспечение хорошо, оно оставалось практически неизменным в течение последних двух десятилетий, и в связи с этим оно становится устаревшим и не поддерживает современные технологии. Например, BIOS по-прежнему использует 16-битный код, в то время как большинство ноутбуков и ПК используют 32- и 64-битный код.

EFI

EFI, сокращенная форма Extensible Firmware Interface, представляет собой спецификацию системного встроенного ПО нового поколения, которая предоставляет первые инструкции, используемые ЦПУ для запуска аппаратного обеспечения, и передает управление загрузчику. EFI, иногда также называемый Unified Extensible Firmware Interface (UEFI), имеет определенные преимущества перед BIOS. Например, это помогает гарантировать, что ваш компьютер загружается с использованием только программного обеспечения, которому доверяет производитель ПК, т. Е. Поддерживает функцию «Безопасная загрузка» для повышения безопасности.

Зная версию BIOS вашего компьютера, вы сможете узнать, установлена ​​ли у вас самая последняя версия прошивки. На компьютерах с Windows вы можете получить информацию о версии прошивки с помощью командной строки. Кроме того, вы можете использовать помощник по обновлению для вашего устройства.

Вообще говоря, чтобы увидеть версию прошивки любого оборудования, вы можете открыть Диспетчер устройств, развернуть категорию, выбрать оборудование, щелкнуть по нему правой кнопкой мыши и выбрать «Свойства». Теперь на вкладке «Сведения» в раскрывающемся меню «Свойства» выберите «Аппаратные идентификаторы». Здесь, в таблице значений, вы должны увидеть версию прошивки.

Читать . Проверьте, использует ли ваш компьютер BIOS или UEFI.

Обновление прошивки


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

Некоторые обновления встроенного программного обеспечения применяются нормально и выглядят как обычное обновление программного обеспечения. Тем не менее, другие могут занять много времени, так как они могут включать в себя копирование прошивки на переносной накопитель, а затем загрузку его на устройство вручную. Тем не менее, некоторые устройства имеют специальный раздел в административной консоли, который позволяет применять обновление прошивки или руководство пользователя для полной справки.

Чрезвычайно важно убедиться, что устройство, получающее обновление прошивки, не выключается во время применения обновления. Частичное обновление прошивки приводит к повреждению прошивки, что может серьезно повредить работу устройства. Итак, просто убедитесь, что после запуска средства обновления прошивки вы дадите завершению обновления.

Читать . Как обновить BIOS.

Разница между прошивкой и программным обеспечением


Часто слово «Прошивка» и «Программное обеспечение» используются взаимозаменяемо, то есть как отдельная или совокупность компьютерных программ, назначенных для какой-либо задачи на компьютере. Но в действительности именно работа определяет корни этих категорий (прошивки и программное обеспечение), в которые мы их помещаем.

Например, программное обеспечение является виртуальным, поэтому его можно копировать, изменять и уничтожать. Он часто хранится в памяти, которая легко доступна и даже может быть заменена пользователем. Но в случае прошивки память, которую она хранит, часто встроена в само устройство и не может быть заменена пользователем. Это сделано намеренно, чтобы предотвратить любое вмешательство или удаление, поскольку это крайне важно для работы устройства и может привести к серьезным последствиям при удалении.

Кроме того, программное обеспечение часто обновляется, и поэтому информация, хранящаяся в нем, часто модифицируется/изменяется при каждом выполнении приложения. Напротив, прошивка не сильно изменится, если вы не будете часто менять настройки. Существует также очень мало или не требуется менять прошивку устройства.

Надеюсь, это объясняет, что означает прошивка.

Intro to Hardware Hacking — Dumping your first Firmware

Безопасность Интернета вещей — это захватывающая область, которая открывает двери для множества интересных исследований. Когда вы окунетесь в кроличью нору аппаратной безопасности, вы столкнетесь с целым рядом интересных и разнообразных проблем: прослушивание Bluetooth, программно-определяемое радио, использование ARM, обратный инжиниринг и множество доработок и поломок оборудования. Однако знание с чего начать может быть запутанным и трудным, поэтому мы поможем вам начать работу, показав, как сделать дамп прошивки с устройства IoT.

Одним из основных шагов при тестировании устройства IoT на проникновение является анализ прошивки устройства. Для этого есть несколько причин, но в основном:

  • Прошивка может содержать конфиденциальную информацию, такую ​​как ключи шифрования, ключи API и другие жестко закодированные секреты.
  • Мы можем изменить прошивку и прошить устройство нашим исправленным кодом, чтобы изменить интересную логику в микросхеме.

Часто микропрограммы для различных флеш-чипов можно найти в Интернете, выполнив простой поиск в Google; однако прошивка не всегда может быть доступна в Интернете.Это когда все становится интересно, так как вам нужно вручную извлечь прошивку из устройства, открыв его и подключившись к микросхеме флэш-памяти.

Шаги по извлечению прошивки из устройства IoT относительно просты, но есть несколько вещей, которые могут показаться запутанными, особенно если вы не так много работали с аппаратными устройствами. В любом случае, даже если вы не проводите оценку, извлечение и анализ прошивки устройства может быть очень интересным.В этом есть что-то очень киберпанковское. Это клише? Совершенно верно, но давайте, все специалисты по безопасности тайно любят все, что связано с киберпанком и хакерскими стереотипами 1995 года. В этом сообщении блога я расскажу о процессе сброса прошивки с флеш-чипа. Я не буду предполагать, что у вас есть опыт работы с оборудованием.

Расположение микросхемы флэш-памяти в устройствах Интернета вещей

В этом посте мы собираемся извлечь прошивку из IP-камеры SP009 Sricam.IP-камера Sricam имеет ряд уязвимостей, которые делают ее идеальным устройством для обучения эксплуатации Интернета вещей. Обратите внимание, что те же шаги, которые мы собираемся выполнить, применимы практически к любому другому устройству.

Первый шаг — открыть устройство. Если вы планируете много исследовать безопасность Интернета вещей, я бы посоветовал приобрести хороший набор отверток. Затем, с вашей новой блестящей отверткой в ​​руке (или той отверткой, которую вы нашли в своем гараже) откройте устройство и изучите различные микросхемы на плате.Вот как выглядит IP-камера в открытом состоянии:

Микропрограмма устройства

находится в микросхемах флэш-памяти, которые часто имеют восемь контактов, соединяющих ее с платой. Они также относительно небольшие. Имея только эти подсказки, мы знаем, что микросхема флэш-памяти должна быть той, которая находится в нижней части изображения выше. Однако, чтобы убедиться, что мы провели тщательный анализ, давайте определим модель и серийный номер для каждого чипа.

  • Микросхема MXIC, деталь MX25L12835F .Информацию об этом можно найти здесь
  • Чип Grain Media, деталь GM8135S-QC .
  • Микросхема MediaTek, деталь MT7601UN .

После быстрого поиска в Google мы определили, что микросхема с номером детали MX25L12835F является микросхемой флэш-памяти, содержащей прошивку для устройства. В документации также указано, что это микросхема SPI (Serial Peripheral Interface). SPI — это не что иное, как протокол для связи во встроенной системе.SPI обеспечивает быструю, синхронную, последовательную связь между различными компонентами на плате, и каждый вывод служит разным целям для связи SPI. Здесь вы можете много узнать о SPI и о том, как он работает.

Следующий шаг — выяснить, что делает каждый вывод на микросхеме. Поскольку мы определили номер компонента для микросхемы микропрограммы, мы можем найти техническое описание микросхемы в Интернете (ссылка выше). На странице 7 мы видим схему микросхемы. Мы хотим найти следующие контакты, чтобы мы могли подключиться к чипу и сбросить прошивку:

  • CS : Выбор микросхемы
  • MISO : Master In Slave Out (вывод данных)
  • GND : Земля
  • MOSI : Master Out Slave In (ввод данных)
  • Vcc : Общий коллектор напряжения для питания микросхемы.
  • SCLK Последовательный тактовый вход

Глядя на техническое описание, мы определяем следующие номера контактов:

  CS ----- PIN # 1 
MISO ----- PIN # 2
GND ----- PIN # 4
MOSI ----- PIN # 5
SCLK ----- PIN # 6
Vcc ----- PIN # 8

Дамп прошивки

Хорошо, теперь вопрос: как мы узнаем, какой контакт какой в ​​нашем устройстве? Видите эту точку в верхнем левом углу схемы микросхемы? Найдите ту же точку на микросхеме, чтобы определить контакт №1.На предыдущем изображении вы можете увидеть точку в верхнем левом углу.

Для дампа прошивки нам понадобится микроконтроллер, который может обмениваться данными с микросхемами SPI. У нас есть несколько вариантов, в том числе:

В этом случае мы будем использовать бейдж Attify.

Чтобы сделать нашу работу более удобной, мы можем использовать зажим SOIC (Small Outline Integrated Circuit) для подключения микросхемы флэш-памяти к нашему микроконтроллеру. Зажим SOIC выглядит так:

Способ использования зажима SOIC относительно прост: найдите красный кабель, чтобы определить конец, который должен контактировать с контактом №1 микросхемы SPI.Затем закрепляем соединительные кабели на другом конце зажима SOIC в соответствии с нумерацией контактов, которую мы определили выше. Каждый кабель, в свою очередь, подключается к нашему микроконтроллеру с использованием следующей конфигурации SPI:

  Значок IP-камеры 
-----------------------
SCK <--------> SCLK
MISO <----- ---> SI / SO (MOSI)
MOSI <--------> SO / SI (MISO)
CS <--------> CS
GND <------ -> GND
3,3 В <--------> Vcc

В документации к микроконтроллерам, которые вы используете, следует указать, какие выводы вы можете использовать для связи SPI.В этом случае мы определяем вышеупомянутые соединения, определяя расположение контактов для значка аттестации. Ваши соединения должны выглядеть примерно так:

Не обращайте внимания на кабели, припаянные к микросхеме в верхней части камеры. Они подключены к микросхеме UART, о которой мы расскажем в одной из следующих статей.

Я должен сделать предупреждение относительно вывода Vcc. Вы подключаете контакт Vcc к своей плате, если и только если вы решите не подключать свою IP-камеру (или любое другое устройство, которое вы можете тестировать на проникновение) к источнику питания (скорее всего, через USB-кабель).Если вы подключаете камеру к источнику питания во время этого процесса, вы НЕ ДОЛЖНЫ подключать вывод Vcc, так как вы будете подавать на чип слишком много энергии, что, в свою очередь, может повредить плату или порты USB на вашем компьютере.

Теперь я не буду лгать и скажу вам, что зажим SOIC упрощает все. Это не так просто, как зацепить зажим на микросхему и предположить, что все соединения выполнены. Вам нужно будет внимательно посмотреть на контактные площадки на зажиме и убедиться, что каждая контактная площадка касается правильного контакта на микросхеме.Это может быть болезненно, и если у вас нет точной руки, вы можете повредить булавки. Поначалу это может показаться раздражающим, но именно это мне и нравится в работе с оборудованием: это требует определенного терпения (возможно, физического терпения?), Которого вы не испытываете при работе с программным обеспечением. Просто продолжайте и получайте удовольствие.

Если вы разочарованы зажимом SOIC, вы можете попробовать вместо него использовать зажимы типа «крокодил», которые, как я считаю, очень полезны при работе с крошечными булавками. Те же соединения с использованием зажимов типа «крокодил» выглядят так:

Хорошо, за работу.Затем подключите микроконтроллер к компьютеру и убедитесь, что ваше устройство обнаружено. Мне нравится использовать виртуальную машину Linux, где у меня есть все мои инструменты для эксплуатации Интернета вещей. Введите следующее, чтобы убедиться, что ваш микроконтроллер указан в списке:

Теперь нам нужно будет использовать spiflash.py для дампа прошивки. Клонируйте это репо и перейдите к libmpsse / src / examples . Далее, чтобы сбросить прошивку с устройства, запустите следующее:

  $ sudo python spiflash.py -s 15000000 -r прошивка.бин 

Обратите внимание, что если вы не используете sudo , инструмент может не обнаружить USB-устройство. Флаг -s указывает размер данных, которые мы хотим сбросить. В документации к микросхеме также может быть указан размер прошивки. В этом случае мы используем достаточно большой размер, чтобы гарантировать, что мы получим всю прошивку.

Далее заверяем, что с микросхемы что-то сброшено:

Если у вас неправильно настроены соединения, то приведенное выше ничего не даст.Если вы видите список искаженных символов, мы можем перейти к следующему шагу.

Затем мы извлечем прошивку из полученного двоичного файла, используя binwalk . Загрузите binwalk и выполните следующую команду для извлечения прошивки:

Результат выше может выглядеть примерно так:

Теперь перейдите в созданную папку.

  $ cd _test.bin.extracted / squash-fs 

У вас может не быть папки squash-fs .В этом случае микропрограмма, вероятно, была извлечена неправильно, возможно, из-за проблем с подключением. Проверьте свои соединения и снова запустите spiflash.py . Мне пришлось запустить это несколько раз, прежде чем я смог правильно извлечь прошивку.

Как видите, теперь у вас есть доступ ко всей файловой системе из дампированной прошивки в каталоге squash-fs . SquashFS — это сжатая файловая система, обычно используемая во встроенных системах.

Теперь вам решать, что вы хотите с ним делать.Исследуйте сценарии, ищите секретные строки и т. Д. Вы даже можете изменять файлы и записывать обратно на флеш-чип, используя spiflash.py -w .

Если это похоже на то, что вам нравится делать, вы можете использовать приведенный ниже список, чтобы найти все материалы, которые вам понадобятся для сброса прошивки с флеш-чипов:

Вы часто можете найти IP-камеру SP009 Sricam на eBay, но вы также можете попрактиковаться и со старыми маршрутизаторами. Лучший способ начать — открыть устройства и начать изучать и исследовать.

Другой способ взаимодействия с прошивкой — через контакт JTAG, о котором мы расскажем в другом сообщении блога. Мы продолжим писать о безопасности Интернета вещей и углубляться в эту захватывающую область в будущих публикациях.

Дамп прошивки | Hackaday

Вот доклад DEF CON, в котором используются инструменты, которые у вас, вероятно, уже есть, и это должно стать вашим следующим хакерским приключением. В своем субботнем утреннем выступлении [Марк Уильямс] и [Роб Стэнли] рассказали о процессе добавления собственного кода для игровой мыши.Этот процесс представляет собой ускоренный курс по изменению двоичного кода стандартной прошивки с сохранением исходной функциональности.

Отправной точкой для их работы является индустрия киберспорта. Размах киберспортивных мероприятий в последние годы резко вырос. Турнир International 2016 собрал 17 000 участников, 5 миллионов смотрели онлайн. Призовой фонд в 20 миллионов долларов (19 миллионов долларов из этого краудфандинга за счет внутриигровых покупок) является большим стимулом для получения конкурентного преимущества для победы. Конкурсантам разрешается приносить свои собственные периферийные устройства, что вызывает вопросы: можете ли вы переделать стандартную игровую мышь, чтобы делать интересные вещи?

Мышь Steelseries Sensei была выбрана для взлома, потому что она имеет мощный микроконтроллер: STM32F103CB.Исследователи предположили, что при 128 КБ флэш-памяти у них будет достаточно места для добавления кода. Микросхемы STM32 программируются через ST-Link, который очень недорого доступен через платы ST Discovery. Они выбрали STM32F4DISCOVERY, который стоит около 20 долларов.

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

Сначала они просмотрели двоичный код в поисках большого блока нулевых значений, обозначающего неиспользуемое пространство во флеш-памяти. Внедренная прошивка предназначена для перечисления в качестве USB-клавиатуры, открытия Блокнота, затем ввода, сохранения и выполнения сценария PowerShell перед возвратом к стандартной прошивке (гарантируя, что мышь по-прежнему будет работать как мышь). По сути, это превращает USB Rubber Ducky в стандартную прошивку мыши.

Есть несколько полезных навыков, благодаря которым работа над этим проектом станет полезным опытом.Чтобы правильно скомпилировать свой собственный код, вам необходимо выбрать правильный адрес смещения, по которому он будет в конечном итоге вставлен в двоичный файл прошивки. Таблица векторов исходного кода должна быть переписана, чтобы сначала перейти к внедренному коду, и после его выполнения потребуется вернуться к выполнению с помощью мыши. Это показано в потоке программы слева. Оба этих перехода требуют сохранения и восстановления программного счетчика и регистров. Стек ARM является вычитающим, и для работы с добавленным кодом необходимо обновить адрес.

Разговор закончился живым демо, которое отлично зарекомендовало себя. Вы можете проверить код в репозитории MDHomeBrew. В этом случае сценарий PowerShell добавляет сочетания клавиш для читов DOOM. Но, как мы уже говорили ранее, опыт использования двоичного кода прошивки — это то, где ценность будет для большинства людей. Имея за плечами этот успех, вы можете решать более сложные задачи, такие как взлом игровой клавиатуры [Sprite_TM], где прошивка не могла быть легко сброшена, а двоичный файл обновления был довольно запутанным.

Руководство по взлому оборудования: дамп и восстановление прошивки

Так что, возможно, у вас просто валяется старый маршрутизатор или устройство, и вам интересно, что вы можете найти внутри. Или вы обоснованно обеспокоены тем, что ваши устройства небезопасны или содержат некоторую оплошность со стороны инженеров с точки зрения безопасности.

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

Но не бойтесь, вы можете проверять свои устройства, если вы не меняете их IP-адреса и не вызываете умысла.

Мы можем взаимодействовать со встроенными портами устройства, которые инженеры часто оставляют открытыми для отладки или прошивки нового программного обеспечения. И мы рассмотрим это в двух других уроках. Но что произойдет, если у вас нет порта, но вы действительно хотите проверить это ПЗУ, записанное на Flash?

Давай проверим.Но сначала нам понадобится какое-нибудь снаряжение.

Автобус Пират

BusPirate был создан Яном Леснетом из DangerousPrototypes и представляет собой инструмент для устранения неполадок, который обменивается данными между ПК и любым встроенным устройством по протоколам 1-Wire, 2-Wire, 3-Wire, UART, I2C, SPI и HD44780 LCD. все при напряжении от 0 до 5,5 В постоянного тока. (SparkFun, n.d.) Он будет использоваться для восстановления данных флэш-памяти SPI с маршрутизатора (дамп прошивки) и для последовательной связи UART.

Изображение взято из: Sparkfun

CJMCU-232H

FTDI 232H — это микросхема производства Future Technology Devices International.CJMCU-232H — это коммутационная плата со встроенным чипом 232H, который позволяет пользователям легко использовать чип через USB. Его можно использовать для связи через USB с UART (RS232, RS422 или RS485), FIFO, JTAG, SPI, I2C, Bit-Bang и многим другим. Он будет использоваться для связи UART и JTAG с атакованными устройствами.

Изображение взято из: Ebay

Целью будет маршрутизатор Mikrotik mAP2n.

Поскольку цель состоит в том, чтобы извлечь на нем прошивку и проверить любые другие возможные векторы атаки, сначала потребуется некоторая разборка.

Поддеть роутер было очень легко, и если посмотреть на лицевую сторону, почти сразу можно увидеть последовательный порт, помеченный как TX (передача) и RX (прием).

На задней панели можно увидеть два других контакта, необходимых для последовательной связи, контакты питания (3V3) и общего заземления (GND).

Заявление об отказе от ответственности: на самом деле это не контакты, а места, где можно разместить так называемые разъемы pogo pin для достижения соединения, но это просто семантика, и, поскольку на самом деле у них нет определенного имени, я буду называть их контактами .К, спасибо.

Также можно увидеть порт JTAG или интерфейс, помеченный 3V3 для вывода питания 3,3 В, символ заземления для порта заземления, TCK для тестовых часов, RST для сброса теста, TMS для выбора режима тестирования, TDI для тестирования Data In и немаркированный, который, скорее всего, является просто TDO для Test Data Out. JTAG означает Joint Test Action Group, и интерфейс позволяет разработчикам оборудования тестировать и диагностировать системные сбои на плате, а также загружать данные в различные микросхемы памяти на плате.В этом случае он, скорее всего, использовался для прошивки прошивки в микросхему флэш-памяти SPI на плате.

Кстати, можно увидеть микросхему флэш-памяти Winbond 25Q128FVSG с последовательным периферийным интерфейсом (SPI), которая, скорее всего, является памятью, в которой хранятся прошивка и все данные устройства.

Взаимодействие с микросхемой флэш-памяти SPI

Теперь наиболее вероятный кандидат, содержащий микропрограммное обеспечение, определен, это чип Winbond SPI Flash, и должно быть легко найти способ прочитать его и сохранить за пределами чипа.Вот где пригодится BusPirate. Его можно подключить к ножкам микросхемы SPI SMD с помощью зондов Saleae, а затем можно использовать какое-то программное обеспечение, чтобы сообщить BusPirate о необходимости копирования всех данных с микросхемы на компьютер. Но сначала важно понять, как подключить BusPirate к микросхеме и как работает протокол SPI.

Протокол SPI

Изображение взято из: Sparkfun

На рисунке выше показана схема связи SPI между ведущим и ведомым.Требуется четыре канала:

  • SCK, что означает последовательные часы (чаще CLK). Сторона, которая генерирует часы, всегда является хозяином.
  • MOSI — Master-Out, Slave-In (как TX по последовательному протоколу). MOSI используется, когда ведущему нужно отправить данные ведомому.
  • MISO — Master-In, Slave-Out (как RX по последовательному протоколу). MISO используется, когда ведомому устройству необходимо отправить данные ведущему устройству.
  • SS — Slave-Select (чаще Chip Select, CS) Всегда есть только один мастер, но может быть несколько подчиненных.SS или CS используются, чтобы сказать ведомому устройству проснуться и начать отправку / получение данных. Он также используется для выбора ведомого устройства, с которым нужно связаться, если их несколько.

После получения базовых знаний о протоколе SPI, BusPirate легко подключается к микросхеме, а программное обеспечение выполняет все остальное.

Распиновка шины

BusPirate

Контакты BusPirate очень легко найти, так как они отмечены прямо на плате. Есть все четыре необходимых контакта, плюс питание (3V3, 3.3 вольта) и общий вывод заземления, которые необходимы для подачи питания на устройство и его работы.

Распиновка

Winbond W25Q128FVSG

Чип Winbond, с другой стороны, не имеет четко обозначенных контактов, но распиновку можно найти в его техническом описании, которое доступно в Интернете.

Изображение взято из: pjrc.com

Подключение БП к SPI Flash

После определения всех контактов, необходимых для подключения BusPirate к микросхеме SPI, остается только подключить их с помощью соединительных кабелей и датчиков Saleae.

Дамп прошивки / w flashrom

Flashrom — это утилита, используемая для идентификации, чтения, записи, проверки и стирания микросхем флэш-памяти. Он будет использоваться вместе с BusPirate для получения содержимого микросхемы SPI Flash.

BusPirate подключен к портативному компьютеру с виртуальной машиной Kali. При выполнении команды lsusb в терминале Kali BusPirate отображается в списке, что означает, что он распознан и готов к работе.

Затем Flashrom будет использоваться для попытки подключиться к BusPirate и посмотреть, распознает ли он подключенный к нему чип.Если все идет хорошо, значит, штыри подключены правильно и готовы к «разгрузке».

Программное обеспечение Flashrom действительно обнаружило флеш-чип Winbond «W25Q128.V» и готово к использованию. Флаг -p в команде обозначает программист, и с его помощью можно указать, что BusPirate подключен к микросхеме SPI и доступен через / dev / ttyUSB0. Кроме того, скорость SPI установлена ​​на 1 МГц, что является золотом между надежностью и скоростью. Скорость может варьироваться от 30К до 8М

Команда, используемая для считывания прошивки, такая же, как и предыдущая, с двумя новыми флагами.Первый новый флаг -r означает чтение, который принимает имя файла в качестве параметра, в котором хранится содержимое флэш-ПЗУ. Второй флаг — -VVV, что означает подробный, имеющий несколько уровней. Три V — это самый подробный уровень, который будет использоваться, поскольку будут проанализированы детали сброса.

Цикл задержки, который использует BusPirate, немного отключен, вероятно, потому, что данные отправляются через USB сначала через BusPirate в ОС хоста, а затем из ОС хоста в виртуальную машину, на которой работает Kali.Но, тем не менее, ему удается выполнить повторную калибровку и учесть задержку около 14% (14 микросекунд на 100 микросекунд).

Затем программное обеспечение Flashrom продолжает исследовать различные микросхемы, как это было в первый раз, пока не обнаружит микросхему флэш-памяти Winbond. Затем он сопоставляет область флэш-памяти, выбирая область памяти, которая содержит данные, проверяет, включена ли защита блоков, и если все идет хорошо, BusPirate начинает отправлять данные, которые хранятся в файле, переданном в качестве параметра для флага -r. .Данные отображаются в виде шестнадцатеричного потока. Поскольку используется только частота 1 МГц, потребуется некоторое время, прежде чем данные чипа будут скопированы на ноутбук.

Распаковка бинарной прошивки / w Binwalk

После завершения BusPirate может начаться этап распаковки, для которого будет использоваться Binwalk.

Binwalk — еще один инструмент, созданный Крейгом Хеффнером (/ dev / ttyS0), по его словам: «Binwalk — это быстрый и простой в использовании инструмент для анализа, обратного проектирования и извлечения образов прошивки.”

Флаг -M означает матрешку, которая рекурсивно проверяет извлеченные файлы и при необходимости извлекает найденные сжатые файлы. Флаг -e означает извлечение, которое автоматически извлекает известные типы файлов.

Некоторые интересующие файлы уже можно увидеть во время извлечения. Один из них — это закрытый ключ PEM DSA и открытый ключ OpenSSH DSA, который, скорее всего, используется для аутентификации и удаленного управления устройством. Их можно либо вырезать с помощью инструмента dd GNU / Linux, либо искать вручную среди извлеченных файлов.

После небольшого исследования было найдено возможное использование ключа. «Начиная с RouterOS 2.9.13 доступна поддержка ключей SSH DSA и передачи команд через ssh. Это позволяет вам без особых проблем запускать сценарии с удаленной машины против RouterOS ». (Mikrotik Wiki, без даты)

Дамп прошивки с программатором Ch441a

Рик Виссер //

Примечание. Этот блог также будет лабораторией для любой из предстоящих конференций Wild West Hackin ’Fest .

Во время недавней помолвки я столкнулся с проблемой. Проблема, с которой я столкнулся, заключалась в том, что микросхема SPI, с которой я пытался сбросить прошивку, была микросхемой 1,8 В. Это не было бы проблемой, но и shikra, и bus pirate рассчитаны на чипы 3,3 В. Я подумал о создании делителя напряжения для понижения напряжения, но после небольшого поиска в Google я наткнулся на Ch441a с адаптером 1,8 В. Решил заказать с доставкой сутки. После того, как я поработал с ним и смог успешно сбросить прошивку с 1.8v IC, не снимая микросхему SPI с печатной платы, я решил написать об этом блог. Этот блог предназначен для любой аудитории. Это может быть слишком пошагово для людей среднего или опытного уровня, которые сбрасывали прошивки с помощью других инструментов, но я хотел включить и новичков, потому что мы все с чего-то начали, верно?

Ниже приведена фотография полученного мной пакета Ch441a. В конце этого блога я буду включать ссылки на те товары, которые я купил или на которые ссылаюсь.

Ch441a Содержимое упаковки

Ch441a очень прост в настройке.Обычно для проведения любого тестирования я использую операционную систему Linux. Однако из предыдущего опыта я знаю, что AsProgrammer лучше работает на ПК с Windows. Все, что вам нужно, это драйверы и программное обеспечение AsProgrammer, которые можно найти по следующим ссылкам.

в каталогах «Ch441-Windows-SPI-I2C-Driver + SDK-library» и «Ch441-Windows-Serial-Driver + SDK-library» в https://github.com/boseji/Ch441-Store.

Программное обеспечение

AsProgrammer — https://github.com/nofeletru/UsbAsp-flash/releases/

После загрузки программного обеспечения и его установки на моем ноутбуке с Windows пришло время выбрать цель.Я зашел в свою коллекцию электроники для «гаражной распродажи» и нашел маршрутизатор Netgear WNDR3700, который подойдет. Взломав корпус и проведя разведку чипов для устройства, я обнаружил целевой чип SPI. Ниже приведено изображение платы с идентифицированным чипом SPI.

Печатная плата Netgear WNDR3700 с идентифицированным чипом SPI

Как и в любой другой разведке, вам захочется найти больше информации. Поэтому я взял техническое описание микросхемы MX25L6445E SPI, посмотрел на схему контактов и определил тип корпуса, который установлен на печатной плате WNDR3700.

Лист данных Конфигурация и описание выводов

Изучив техническое описание, я заметил, что этот конкретный чип имеет VCC 3,3 В, а фактический тип корпуса на плате — это 16-контактный чип. Благодаря этой информации мы знаем, что нет необходимости использовать адаптер 1,8 В. Но похоже, что у нас может быть проблема с 16-контактным корпусом микросхемы (обратите внимание, что средние 8 контактов не используются). Ch441a поставляется только с 8-контактным зажимом для микросхемы и разъемом. Я мог бы припаять провода к работающим контактам MX25L6445E и подключить его к разъему Ch441a Zero Insertion Force (ZIF), но, поскольку я мог использовать 16-контактный зажим для микросхемы для будущих контактов, я решил купить его.

После быстрого поиска в Интернете я выбрал 16-контактный зажим для микросхемы, который включал уже припаянные разъемы для подключения к разъему ZIF Ch441a. Я размещу ссылку на зажим для 16-контактного чипа внизу этого блога вместе со ссылкой для программатора Ch441a. Разъемы, которые были снабжены 16-контактным зажимом для микросхемы, включали 8-16-контактный разъем, а также 16-16-контактный разъем. Я также отключил 8-16-контактный разъем и обнаружил, что он имеет правильные дорожки для непосредственного взаимодействия с 16-контактным чипом MX25L6445E и разъемом Ch441a ZIF.Вот изображение чип-клипа с заголовками.

16-контактный зажим для микросхем с разъемами

Подключить было несложно, так как все имеет либо маркировку выводов, либо шелкографию, либо какой-либо индикатор, указывающий на вывод 1. Например, на микросхеме есть отметка в углу, где находится вывод 1. На зажиме микросхемы есть одна из жил кабеля красного цвета для обозначения контакта 1, а на интерфейсной плате нанесены шелкографией номера для обозначения контактов. Наконец, Ch441a также имеет шелкографию, чтобы указать, где находится первый вывод для микросхемы типа 24xxx или 25xxx.Ниже приведены изображения с описанием индикаторов маркировки булавкой и шелком.

Индикатор контакта 1 для микросхемы MX25L6445E Шелкография на Ch441a для номера вывода / чипа

Шелкография Ch441a имеет индикаторы 25xx и 24xx с маленькими полукругами справа от них. Этот полукруг указывает на то, что вывод 1 находится рядом с полукругом и будет правым верхним углом. Разъем ZIF имеет 16 контактов, поэтому он разделен пополам: правая сторона для микросхем 24xx и левая сторона для микросхем 25xx.В этой ситуации мы будем использовать левую сторону сокета ZIF, поскольку наш чип — это чип MX 25 L6445E.

Обозначения контакта 1 на плате заголовка и кабеле с зажимом микросхемы

На приведенном выше изображении показан кабель с зажимом для микросхемы, прикрепленный к плате заголовка, с выровненными обозначениями контакта 1.

Затем мы прикрепим зажим для микросхемы к микросхеме так, чтобы красный индикатор контакта 1 был совмещен с обозначением контакта 1 микросхемы MX25L6445E, как показано ниже.

Зажим для микросхемы , установленный на микросхеме MX25L6445E

Наконец, мы устанавливаем разъем с кабелем зажима микросхемы на ZIF-сокет Ch441a, как показано ниже.

Выравнивание выводов заголовка с гнездом ZIF Ch441a

Теперь, когда все подключено, мы можем сделать дамп прошивки с нашей микросхемы MX25L6445E. Мы подключаем Ch441a к USB-порту на нашем ПК с Windows и открываем AsProgrammer. Во-первых, мы должны выбрать Ch441a в качестве аппаратного устройства в меню «Оборудование».

ВАЖНОЕ ПРИМЕЧАНИЕ: Ch441a подает питание на плату, поэтому вам не нужно подключать WNDR3700 к стене. Если вы это сделаете, вы можете повредить свой Ch441a.

Выбор оборудования в программе AsProgrammer

Следующее, что вам нужно сделать, это выбрать тип микросхемы SPI, которую вы будете использовать.Выберите IC в главном меню, затем SPI, затем поставщика, а затем IC. В данном случае нам нужна микросхема MACRONIX MX25L6445E.

Выбор ИС в AsProgrammer

После выбора чипа он будет показан в верхнем меню AsProgrammer. Команды «Размер», «Страница» и «SPI» также заполняются автоматически, поэтому вам не придется с ними связываться. Вы также хотите подтвердить, что выбран переключатель SPI. Ниже приведен снимок экрана с инструкциями по настройке AsProgrammer.

Конфигурация AsProgrammer после выбора IC.

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

Этому конкретному чипу потребовалось 1,5 минуты, чтобы прочитать содержимое, которое может быть показано ниже на скриншоте ниже после чтения содержимого чипа MX25L6445E.

Успешное чтение микросхемы MX25L6445E.

Теперь, когда у нас есть дамп прошивки, мы можем оценить ее на предмет чего угодно.В этом случае я использовал «strings» или «strings.exe» (вам нужно будет загрузить его для ОС Windows) для поиска «пароля» и «SSID», как показано ниже.

Использование строк для поиска «пароля» и «SSID»

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

Лучшее в Ch441a заключается в том, что с другим оборудованием, таким как Bus Pirate и Shikra, я обнаружил, что мне нужно удалить чип SPI с платы, чтобы взаимодействовать с ним, из-за того, что другие схемы мешают целевому чипу SPI.Однако с Ch441a я могу просто поместить зажим для микросхемы на микросхему и выгрузить прошивку, не беспокоясь о повреждении компонента путем распайки и пайки его на отколовшейся плате.

Если вам понравился этот пост в блоге и вы хотите запачкать руки, приходите и присоединяйтесь к нам на одной из наших конференций Wild West Hackin ’Fest. Я сделаю эту и многие другие лаборатории доступными для посетителей, чтобы они могли поиграть.

Ниже приведены ссылки на товары, которые я приобрел в блоге.

Присоединяйтесь к списку рассылки блогов BHIS — получайте уведомления, когда мы публикуем новые блоги, веб-трансляции и подкасты.

Связанные

Как получить прошивку

Я выпустил четвертый эпизод серии Hardware Hacking Tutorial на YouTube-канале Make Me Hack . Этот выпуск о «Как получить прошивку».

Учебник по взлому оборудования Серия предназначена для обмена информацией о том, как взломать оборудование и как выполнить обратный инжиниринг. Сериал полезен как новичкам, так и экспертам.

Если вы изо всех сил пытаетесь вытащить прошивку из своего устройства, это видео для вас!

В этом видео я объясню возможные способы получения прошивки нашего IoT-устройства.

Я сделаю практический пример одного из этих возможных способов. Я подключу ПК к UART нашего образца устройства, проанализирую журнал загрузки, получу доступ к интерфейсу командной строки загрузчика и сделаю дамп прошивки, используя команду dump, доступную в загрузчике.Я воспользуюсь парой сценариев, сделаю дамп всей EEPROM в шестнадцатеричный текстовый файл ASCII, а затем конвертирую этот файл в двоичную форму, чтобы получить точное изображение EEPROM.

Это четвертый эпизод серии «Учебное пособие по взлому оборудования». В этой полной серии мы поговорим о процессе взлома на основе:

  • Сбор информации с нашего аппарата.
  • Создание среды эмуляции для запуска интересных двоичных файлов.
  • Узнаем, как работает устройство.
  • А потом взломайте устройство и доработайте его прошивку.

Этот выпуск посвящен получению файла прошивки, что является одним из последних шагов на этапе сбора информации.

Введение в получение прошивки

В этом эпизоде ​​я буду использовать тот же образец роутера Gemtek, что и в предыдущих эпизодах.

Один из важнейших основных принципов взлома оборудования — это сначала следовать «простейшему пути», поэтому и в этом случае первое и самое простое действие — поиск в Интернете или в руководстве к нашему устройству, если производитель есть веб-сайт с образом прошивки для загрузки.Если мы найдем изображение для загрузки, мы сможем продолжить анализ изображения.

Иногда загруженный образ зашифрован, он будет расшифрован загрузчиком или процедурой самостоятельного обновления операционной системы; в этом случае, если мы не найдем в Интернете полезную информацию для расшифровки, нам понадобится другой способ сбросить прошивку. После сброса прошивки, извлечения его файловых систем и анализа программного обеспечения, возможно, мы сможем обнаружить, как прошивка была зашифрована.

Иногда прошивка недоступна для загрузки напрямую с ПК со стандартным браузером, но само устройство может загрузить образ.Если это так, мы можем обнюхать связь с Wireshark и, как правило, можем получить некоторую информацию:

  • Мы можем получить URL-адрес файла прошивки, чтобы загрузить прошивку с нашего компьютера под управлением Linux. Иногда сервер разрешает загрузку прошивки только в том случае, если он получает строку «User Agent» нашего устройства, в этом случае мы можем использовать инструмент командной строки, такой как wget или curl, чтобы установить ту же строку User Agent, что и на нашем устройстве (ссылки к этим инструментам ниже).
  • Или мы можем позволить устройству загрузить прошивку и прослушать весь обмен данными с Wireshark, а затем использовать возможность Wireshark для восстановления и сохранения файла, загруженного нашим устройством.
  • Но у нас также могут возникнуть трудности с использованием этого подхода, если устройство использует зашифрованный протокол, такой как HTTPS, в этом случае мы можем получить полное имя сервера с помощью Wireshark, но не полный URL-адрес или содержимое файла. Мы могли бы проделать какой-нибудь трюк, например, используя программу mitmproxy (ссылка ниже), чтобы попытаться провести атаку человека в середине, но если устройство IoT правильно управляет сертификатами безопасности, эта атака не увенчается успехом.
  • Если наше IoT-устройство является маршрутизатором, и если мы попытаемся перехватить связь маршрутизатора, у нас возникнет дополнительная трудность, связанная с тем, что маршрутизатор загрузит обновление прошивки с помощью WAN-интерфейса, который является интерфейсом ADSL или Fiber, и для нас это практически невозможно. нюхать этот интерфейс.Мы могли бы попытаться подключить этот маршрутизатор к существующей локальной сети, изменить его таблицу маршрутизации в его веб-интерфейсе управления и посмотреть, согласится ли он загрузить обновление прошивки через интерфейс Ethernet.

Другая возможность сбросить прошивку нашего устройства — это подключить последовательный интерфейс Linux-бокса к UART устройства и взаимодействовать с загрузчиком устройства. Если устройство имеет загрузчик с интерфейсом командной строки, и если этот интерфейс командной строки имеет команду dump flash, мы можем использовать эту команду для сброса всей EEPROM.Это подход, который мы будем использовать для нашего образца маршрутизатора Gemtek, который мы увидим позже.

Если все вышеперечисленное не помогает, мы можем попробовать использовать интерфейс JTAG с Bus Pirate или Bus Blaster и OpenOCD, как объяснялось в предыдущем эпизоде ​​этой серии, но это довольно сложно, и часто интерфейс JTAG отключен программно. Иногда интерфейс JTAG доступен в течение нескольких миллисекунд после включения устройства, прежде чем он будет отключен, но для использования этой возможности необходимо использовать некоторую дополнительную схему, которая управляет источником питания устройства.

Другая возможность — напрямую читать микросхему памяти EEPROM; в некоторых случаях с EEPROM на основе последовательного интерфейса с легкодоступными пакетами, такими как некоторые EEPROM с пакетами DIP8 или SOIC8, можно читать и записывать содержимое EEPROM, не снимая чип с платы; но также в этом случае мы должны подавать питание на чип, но не хотим, чтобы питание передавалось на всю плату, и чтобы ЦП запускался и мешал нашим показаниям, поэтому иногда нам приходится временно вырезать некоторые выводы из платы. .

Как бы то ни было, обычно пакеты намного сложнее.

Например, в нашем образце роутера корпус действительно компактный, с шагом выводов 0,5 мм, в этом случае нет возможности прикрепить зажим прямо на плату; одна из возможностей — распаять чип и удалить его с платы с помощью термофена, а затем использовать соответствующий адаптер, если он у нас есть, для чтения EEPROM с помощью программатора EEPROM, подключенного к нашему ПК. В любом случае эта операция непроста для любителя, есть возможность повредить микросхему и близлежащие компоненты, если температура станет слишком высокой, и почти невозможно вручную повторно припаять EEPROM на плате позже, поэтому такой подход может использоваться, когда у нас более одной доски и мы можем уничтожить одну.

Анализ файла журнала загрузки

Для нашего образца роутера Gemtek прошивка недоступна в Интернете для загрузки, поэтому нам нужно найти другой способ сделать дамп его прошивки. Мы подключим наш Linux-бокс к интерфейсу UART и проанализируем журнал загрузки, чтобы увидеть, можно ли взаимодействовать с загрузчиком для сброса EEPROM и получить дополнительную информацию о нашем устройстве.

Итак, прежде всего я подключаю свой компьютер к интерфейсу UART маршрутизатора. Все подробности о том, как найти интерфейс UART и как подключиться к нему, доступны во втором эпизоде ​​этой серии.

Затем я запускаю эмулятор последовательного терминала PuTty, включаю запись в файл, включаю устройство и жду, пока процесс загрузки не завершится, чтобы записать большой объем информации на последовательную консоль и появится стандартное приглашение входа в систему Linux.

Теперь я пытаюсь войти в систему, используя имя пользователя и пароль по умолчанию, указанные в руководстве, чтобы получить доступ к интерфейсу веб-управления, но он не работает на последовательной консоли.

Теперь мы можем начать анализ файла журнала загрузки, написанного PuTty, чтобы увидеть, есть ли что-нибудь интересное, обычно мы можем получить много информации из файла журнала загрузки:

  • Мы можем узнать имя и версию загрузчика.
  • Номер детали «Система на кристалле», его архитектура и набор инструкций.
  • Объем установленной оперативной памяти.
  • Количество установленного EEPROM.
  • Ядро и версия операционной системы.
  • Используемые типы файловой системы.
  • Подробная информация о разделе EEPROM.
  • Информация о процессе инициализации в системах Linux.
  • Информация о наличии у загрузчика интерфейса командной строки.

Теперь мы закрываем эмулятор терминала PuTtty и начинаем просматривать файл журнала загрузки, который он записал на диск с помощью команды «меньше».

Одна из первых сведений связана с нашим устройством EEPROM; в строке журнала загрузки MTD означает устройство с технологией памяти, и это имя драйвера устройства для взаимодействия с флэш-памятью. В нашем случае у нас есть флеш-память NAND, которая имеет некоторые особенности:

  • Можно читать или писать по странице за раз. Страница принадлежит большему блоку, который необходимо очистить перед записью (каждый бит равен 1).
  • Можно стереть блок за раз, блок включает в себя много страниц.
  • Во время работы некоторые биты могут самопроизвольно выходить из строя, по этой причине каждая страница имеет определенное количество байтов для кодов исправления ошибок, называемых OOB или данными вне диапазона.
  • Он имеет конечное количество циклов программирования / стирания, это означает, что файловая система должна знать об этом ограничении и равномерно распределять циклы записи / стирания в памяти.
  • Информация в журнале загрузки сообщает нам, что размер страницы составляет 2 Кбайта.
  • OOB, внеполосные данные, используемые для исправления ошибок, составляют 64 байта для каждой страницы.
  • Размер стирания 128 Кбайт.
  • ширина памяти составляет 8 бит, что означает, что к ней обращаются побайтово.

Тогда мы понимаем, что загрузчик — это U-Boot версии 1.1.3, U-Boot — популярный загрузчик с открытым исходным кодом (ссылка ниже).

Кажется, у нас есть дополнительная плата Ralink WiFi Board; Ralink — производитель чипсетов WiFi, который несколько лет назад был приобретен компанией Mediatek. Эта плата, вероятно, находится под металлическим листом на нашей материнской плате.

Похоже, что на этой дополнительной плате также работает загрузчик U-Boot с более поздней версией, но на данный момент эта дополнительная плата нас не интересует.

Мы можем подтвердить, что система на кристалле — это двухъядерный процессор Mediatek MT7621A. Мы уже опознали его, визуально осматривая доску, в первом эпизоде; он работает на частоте 880 МГц.

У нас 128 Мб ОЗУ, и мы можем подтвердить, что у нас есть NAND Flash EEPROM.

Затем у нас есть очень интересное меню: это меню загрузчика U-Boot, которое позволяет, среди прочего, войти в подсказку интерфейса командной строки; это именно то, что мы искали, позже мы перезагрузим роутер и войдем в это меню.В любом случае, по умолчанию U-Boot загружает операционную систему с флэш-памяти.

U-Boot загружает загрузочный образ в память, он состоит из двух частей: ядра Linux и корневой файловой системы. Образ загружается на странице 81.00.00.00 и представляет собой образ MIPS linux, это подтверждает, что у нас есть архитектура MIPS.

Затем операционная система Linux запускается и выводит версию его ядра 2.6.36, а также версию и тип процессора, и это подтверждает, что у нас 32-битный процессор MIPS. Мы также получаем еще одну очень полезную информацию: эта система была построена с использованием Buildroot версии 2015.02, это очень поможет, когда мы создадим среду эмуляции, в которой будут запускаться интересные двоичные файлы. Buildroot — это простой, эффективный и легкий в использовании инструмент для создания встроенных систем Linux посредством кросс-компиляции.

Еще одна полезная информация: корневая файловая система — это файловая система squashfs; это популярная файловая система во встраиваемых устройствах; Он никогда не изменяется в EEPROM, он загружается в RAM во время загрузки, и каждый раз, когда система выключается, а затем снова включается, она перезагружает ту же неизмененную корневую файловую систему.Это второй образ, загруженный загрузчиком U-Boot.

Затем мы можем определить наиболее полезную информацию: как разделена EEPROM, для каждого раздела у нас есть начальный адрес и длина раздела в шестнадцатеричном формате. У нас 9 разделов:

  • два раздела для загрузчика;
  • один раздел, в котором, вероятно, будет храниться конфигурация роутера;
  • два раздела для среды, среды загрузчика;
  • два раздела для ядра и корневой файловой системы squashfs;
  • два раздела хранения для файловой системы чтения / записи, используемой маршрутизатором.

Причина, по которой каждый раздел дублируется, за исключением раздела конфигурации маршрутизатора, состоит в том, чтобы обновить маршрутизатор, обновив неактивные разделы, а затем переключить разделы для загрузки с новых обновленных разделов. Если что-то пойдет не так, роутер может автоматически загрузиться со старых разделов. Раздел конфигурации не дублируется, поскольку в нем хранится конфигурация маршрутизатора (например, пароль Wi-Fi, пароль веб-администратора и т. Д.), Которая остается неизменной при обновлении.

Наконец, ядро ​​Linux запускает процесс init, это первый процесс, запущенный в системе Linux или Unix; здесь мы можем найти еще одну очень полезную информацию: процесс инициализации — это Busybox версии 1.23.1. Это означает, что эта система Linux основана на Busybox, это очень популярный выбор для встраиваемых устройств, потому что Busybox, в виде одиночных и небольших двоичных реализаций, с небольшими ограничениями, содержит множество традиционных команд Linux, таких как процесс инициализации, интерпретатор оболочки. , команда grep, команда ls и многие другие команды Linux.

Еще одна полезная информация: раздел хранения представляет собой файловую систему UBIFS, в которой используется компрессор lzo. UBIFS — это популярная файловая система для флэш-устройств NAND, поскольку она учитывает особенности флэш-памяти NAND и хорошо справляется с так называемым выравниванием износа, что означает равномерное распределение операций записи по всему флэш-устройству NAND для продления срока службы NAND. EEPROM имеет ограниченное количество перезаписей перед тем, как начать выходить из строя.

Ближе к концу цикла загрузки мы видим, что маршрутизатор пытается подключиться к своему мастеру, acs.linkem.com, используя протокол TR069; это стандартный протокол, позволяющий интернет-провайдеру получать удаленный доступ, перезагружать, перенастраивать и обновлять ваш маршрутизатор без вашей помощи или вашего согласия. В этом случае маршрутизатор отключен от Интернета, поэтому он не может связаться со своим хозяином и разрешить имя хоста своего хозяина.

Наконец, в конце мы получаем приглашение для входа в систему. Маршрутизатор называет себя «buildroot», это имя по умолчанию для встроенных систем Linux, созданных с использованием программного обеспечения buildroot.Мы пытаемся войти в систему с именем пользователя «admin», потому что в руководстве у нас есть «admin» и его пароль для доступа к веб-интерфейсу, но вместо получения запроса пароля мы получаем код вызова, который кажется двоичной строкой, закодированной в Base64, потому что символы принадлежат к набору символов Base64, который включает буквы от a до z, как строчные, так и прописные, цифры от 0 до 9, а также символы / char и + char.

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

Дамп содержимого EEPROM в шестнадцатеричном формате в текстовый файл

Мы увидели, что анализируя то, что устройство выводит на последовательную консоль во время загрузки, мы получили много очень полезной и интересной информации; но пока нас в основном интересует интерфейс командной строки U-Boot, чтобы посмотреть, сможем ли мы выгрузить содержимое EEPROM.

Анализируя файл журнала загрузки, мы увидели, что загрузчик U-Boot распечатывает меню, позволяющее пользователю выбрать операцию для выполнения, поэтому мы выключим и включим наш маршрутизатор и подождем, пока меню не отобразится на нашем эмуляторе терминала, а затем нажмите «4», чтобы войти в интерфейс командной строки U-Boot.

Теперь у нас есть приглашение U-Boot. U-Boot — это загрузчик с открытым исходным кодом, который можно сильно настраивать, это означает, что обычно фактически доступна лишь небольшая часть всех команд U-Boot; мы набираем «help», чтобы получить список команд.

Самая интересная команда для нас на данный момент — это команда «nand»; чтобы получить больше информации, мы набираем «help nand».

Мы видим, что у нас есть команда «nand read», которая может читать из EEPROM и записывать в RAM.

Команда «nand write» делает обратное, может читать из RAM и записывать в EEPROM.

«nand erase_write» — аналогичная команда, но стирает EEPROM перед записью.

«nand dump» кажется интересным для сброса содержимого EEPROM, это то, что нам нужно, но он не делает то, что мы хотим, он сбрасывает некоторую информацию о EEPROM.

Команда, которая делает то, что нам нужно, называется «страница nand», мы видим, что если мы передадим номер страницы, она сбросит содержимое всей страницы 2 КБ на нашем терминале, включая 64 байта данных OOB, Out Of Band данные, используемые для исправления ошибок.

Если мы введем «nand page 0», затем «nand page 1» до «nand page FFFF», мы сможем выгрузить содержимое всей EEPROM. Но у нас есть две проблемы:

  • во-первых, невозможно вручную нажать более 65 000 раз «nand page_number»;
  • секунд, у нас EEPROM выгружается в шестнадцатеричном виде в текстовый файл, а не в двоичный файл.

Для первого выпуска мы можем написать небольшой скрипт, который дает нам команды «nand page»; Я пожилой человек, поэтому я использовал древний инструмент, который был популярен в девяностые годы, то есть «ожидать», и он основан на языке TCL, языке с довольно необычным и странным синтаксисом.Вы можете написать этот скрипт на Python, используя модуль Pexpect, если хотите. Я назвал этот скрипт «serial-flash-dump.expect», вы можете найти его в моем репозитории Github, ссылка ниже.

Важно отметить, что эта ожидаемая программа должна взаимодействовать с устройством TTY, последовательным интерфейсом в данном случае, а не со стандартным вводом / стандартным выводом, по этой причине нам нужен инструмент expect или модуль Pexpect в Python. потому что они могут взаимодействовать с устройством TTY. В нашем случае это устройство является последовательным устройством, но, в общем, ожидайте или модуль Python Pexpect будет взаимодействовать с оконечным устройством.

В любом случае это очень простая программа:

  • получить в качестве параметра имя последовательного устройства, в нашем случае это / dev / ttyUSB0;
  • устанавливает последовательные параметры, такие как скорость последовательного порта и так далее;
  • открыть модем;
  • дождитесь строки «Загрузить код загрузчика и т. Д.», Которая является последней опцией в меню U-Boot;
  • затем отправит строку «4» для выбора интерфейса командной строки U-Boot;
  • Затем
  • выполняет длинный цикл от 0 до FFFF, каждый раз ожидая приглашения и сразу после выдачи команды «nand page», передавая в качестве параметра переменную цикла, преобразованную в шестнадцатеричную.

Мы можем увидеть, что делает эта команда, выполнив ее в нашем терминале linux box.

Чтобы сохранить в файл то, что я сбрасываю, мы можем использовать ту же команду с конвейером, передающим его вывод в качестве входных данных для команды «tee»; команда «tee» запишет на стандартный вывод все, что она читает из его стандартного ввода, а также запишет то же содержимое в указанный файл, переданный в качестве параметра, в данном случае «eeprom.txt»; Таким образом, вся EEPROM будет выгружена в файл «eeprom.txt», и мы сможем следить за тем, чтобы этот сценарий был запущен и не завис.

Мы знаем, что EEPROM имеет 128 МБ ОЗУ, она выгружается в шестнадцатеричном формате, поэтому каждый байт преобразуется в 3 символа (две шестнадцатеричные цифры плюс пробел), плюс у нас есть данные OOB для исправления ошибок, которые составляют 64 байта каждые 2 Кбайта, накладные расходы 3%, это означает, что выгружаемый файл будет около 400 МБ. Последовательный интерфейс имеет скорость 115200 бит / с, что означает около 11,5 Кбит / с, это означает, что для сброса всего содержимого EEPROM потребуется около 10 часов!

Мы можем запустить ожидающий сценарий вечером, мы можем долго спать, а поздно утром у нас есть все содержимое EEPROM, выгруженное в шестнадцатеричном формате в наш текстовый файл.

Если мы посмотрим на текстовый файл, мы увидим строки, которые написал наш ожидаемый скрипт, затем, продвигаясь вперед, мы увидим меню, написанное загрузчиком U-Boot, наш скрипт выбрал опцию «4» для командной строки. интерфейс. Затем дождавшись командной строки и отправив команду «nand page 0», U-Boot выгружает первую 2-килобайтную страницу EEPROM, включая данные OOB, используемые для исправления ошибок.

Затем сценарий снова дождался командной строки и выдал команду «nand page 1» и так далее до последней страницы 128-мегабайтного EEPROM, то есть страницы FFFF.

Если мы посмотрим на этот файл, то увидим, что после команды «nand page» у нас есть строка со строкой «page» и номером страницы в шестнадцатеричном формате, тогда у нас есть 2 Кбайт страницы EEPROM, выгруженной в шестнадцатеричном формате, 32 байтов в строке, организованных в четыре группы по 16 строк, разделенных пустой строкой.

Преобразовать шестнадцатеричный дамп в двоичный

Чтобы преобразовать этот текстовый файл дампа обратно в двоичный, мы можем написать сценарий, который выполняет это преобразование. Опять же, я старик, я выучил язык Perl в начале девяностых и широко использовал его до сегодняшнего дня, поэтому я написал этот сценарий на Perl, но, если хотите, вы можете переписать его на Python.Он будет читать текстовый файл в стандартном вводе и будет использовать регулярные выражения для извлечения шестнадцатеричных строк, преобразования их в двоичные и записи вывода в двоичный файл, который будет бит за битом представлять собой изображение EEPROM. Я проигнорировал данные OOB, данные, используемые для исправления ошибок, и, похоже, это не привело к возникновению каких-либо проблем с изображением EEPROM.

Сценарий прост, но кажется более сложным, потому что он имеет возможность включать данные OOB в выходные данные и имеет некоторую проверку ошибок, чтобы предотвратить повторную запись одной и той же страницы дважды, если, например, входной сценарий был сгенерирован в множественные, перекрывающиеся, сеансы.

Скрипт называется «hexdump2bin.pl», и вы можете найти его в том же репозитории Github, что и предыдущий скрипт. Ссылки в описании ниже.

Ядром программы является регулярное выражение, которое предполагает 2 шестнадцатеричные цифры, за которыми следует пробел, повторяющийся 31 раз, за ​​которыми следуют 2 шестнадцатеричные цифры; на этот раз без пробела, потому что в конце строки у нас есть конец строки char, а не пробел.

Затем эта строка разбивается на 32 шестнадцатеричных байта, выполняется некоторая проверка ошибок, а затем каждый шестнадцатеричный байт преобразуется в двоичный и записывается на стандартный вывод.

Мы можем преобразовать файл дампа текста EEPROM, выполняя этот сценарий.

Если мы взглянем на преобразованный двоичный файл с помощью команды «hexdump», мы увидим, что это нормально.

Если мы взглянем на преобразованный двоичный файл с помощью команды «binwalk», мы увидим, что внутри он обнаружил некоторые интересные вещи, такие как заголовок образа U-Boot, строка версии U-Boot, файловая система squashfs, так что, вероятно, это означает, что наш двоичный файл в порядке.

Binwalk — фантастический инструмент для анализа файлов прошивки, он может сканировать двоичный файл в поисках множества различных типов подписей, определять многие типы загрузчиков, образы файловых систем, сегменты сжатых данных, цифровые сертификаты и так далее.Он также может графически отображать энтропию двоичного файла, что позволяет нам легко понять, является ли он простым файлом или зашифрованным или сжатым файлом с необнаруженным алгоритмом сжатия. Это особенно полезно, если файл прошивки был загружен в виде файла обновления прошивки с нашего веб-сайта поставщика устройств.

В любом случае, в следующем эпизоде ​​мы увидим, как извлечь загрузчик, корневую файловую систему и другие файловые системы из этого образа EEPROM и использовать, в более общем смысле, инструмент «binwalk».

Ссылки с дополнительной информацией

  • Автор канала
  • Веб-сайт канала
  • Образец роутера (Gemtek WVRTM-127ACN) на techinfodepot
  • Образец маршрутизатора (Gemtek WVRTM-127ACN), реконструированный на GitHub, включает сценарии для сброса EEPROM в текстовый файл и его обратного преобразования в двоичный файл
  • Последовательный адаптер TTL (партнерская ссылка)
  • PuTTY, эмулятор терминала
  • Wireshark, анализатор Ethernet
  • Curl, инструмент командной строки для передачи данных с URL-адресами
  • Wget, получение файлов с URL-адресами
  • Mitmproxy, бесплатный интерактивный HTTPS-прокси с открытым исходным кодом
  • Автобус Пиратский
  • OpenOcd, Встроенный отладчик
  • U-Boot, Универсальный загрузчик
  • Buildroot, простой, эффективный и легкий в использовании инструмент для создания встроенных систем Linux посредством кросс-компиляции
  • Binwalk, быстрый и простой в использовании инструмент для анализа, обратного проектирования и извлечения образов прошивки
  • SOIC8 SOP8 Flash Chip IC Test Clips Socket Adpter BIOS / 24/25/93/95 Programmer (партнерская ссылка)
  • Второй эпизод: Как найти интерфейс UART

Получение дампа прошивки | CHDK Wiki

Для того, чтобы портировать CHDK, вам понадобится копия (дамп) оригинальной прошивки той модели, которую вы пытаетесь портировать.На этой странице объясняются различные методы получения дампа.

Для большинства камер сценарий Canon Basic Dumper является самым простым и должен быть всем, что вам действительно нужно. Остальные методы представляют в основном исторический интерес.

После создания дампа см. Добавление поддержки для новой камеры.

См. Canon Basic / Scripts / Dumper. Это рекомендуемый метод , который использовался для большинства камер с момента его открытия в 2010 году.

ПРИМЕЧАНИЕ: Этот метод не будет работать на последних (начиная с 2009 года) камерах без модификаций.

CardTricks — это графическая утилита, которая включает в себя udumper и графический интерфейс для подготовки карты.

Вы также можете использовать UDumper без карточных фокусов. См. Udumper и некоторые связанные темы форума:

Метод состоит в том, чтобы сделать / адаптировать загрузчик WIF. Основой для его разработки служит программа обновления оригинальной прошивки для аналогичных моделей камер. Поскольку этот загрузчик имеет функции работы с файлами, этот способ позволяет сохранить дамп оригинальной прошивки на SD-карту. Основная проблема использования этого метода заключается в том, что вам необходимо пройти все этапы инициализации оригинальной прошивки, чтобы иметь возможность записи на флеш-карту.Используется с: A620, A630, A640, A710, S2IS, S3IS.

ПРИМЕЧАНИЕ: Описанный здесь метод требует много работы и больше не нужен — используйте Canon Basic Dumper. Он был оставлен здесь из-за исторического интереса и в первую очередь из уважения к усилиям тех, кто его создал.

Ресивер

Прошивка f для следующих моделей была получена этим методом
A610, A700, A540, G7, SD630, A570IS, SD300, SD450, SD500, A560, SD870, SD1000, SD1200IS, S5IS, A720, G11.

Этот метод основан на «мигании» оригинальной прошивки через светодиод камеры. Вам нужно сделать приемник (фотодиод или фототранзистор), программное обеспечение для записи дампа, декодер и крошечную прошивку, которая выводит прошивку камеры через светодиод. Приемник может быть подключен к последовательному порту (в этом случае вам нужно эмулировать UART в камере) или к микрофонному входу.

Примечание: Многие люди сталкивались с трудностями при попытке получить фотодиод или фототранзистор для этой задачи.У вас есть старая шариковая мышь в мусорном ящике? Каждая ось X и Y считывается при вращении зубчатого колеса, проходящего через световой путь между ИК-светодиодом (передатчиком) и фотодиодным детектором. Нужное вам оптическое устройство легко извлечь из этого. Внимание! Многие фотодиоды мышей чувствительны ТОЛЬКО к инфракрасному свету. Эти фотодиоды нельзя использовать для сброса прошивки, так как они не могут «видеть» светодиодный свет от камеры.

Использование входа звуковой карты []

Я использовал микрофонный вход.Все необходимые файлы (с исходниками) вы можете получить здесь .

Схема я использовал:

 / \
   | |
    \ / + ----------- +
   + === + | | | ---- \
   | | ------- + ---- * ------------ | |
   | === | ---- * --------------- | |
   | | | | ---- /
   | | ---------------- +
   | | фототранзистор
 + ======= + BPW96C или аналогичный
 | |

 3.Штекер 5 мм
 в микрофон
 звуковой карты
 

Протокол передачи:

  • Заголовок (3600 байт) — последовательность «0123456789» для визуального контроля данных.
  • Блоки -4096 блоков данных размером 1К.
  • Адрес (4 байта) — адрес текущего блока.
  • Data (1024 байта) — кусок прошивки.
  • CRC16 x 2 (4 байта) — CRC16 блока (повторяется дважды).

Каждый байт кодируется следующим образом:

, где:

  1. Расстояние между байтами
  2. Расстояние между битами
  3. Широкий импульс — логическая «1»
  4. Узкий импульс — логический «0»

Поток использования:

  • Подключите приемник к микрофонному входу звуковой карты.
  • Запустите приложение для записи (я использовал Adobe Audition) со следующими параметрами: 96 кГц (настраивается), 8 бит, моно.
  • Непосредственное «мигание» светодиода на приемнике (BPW96C).
  • Начните запись. Начать передачу «мигающей» прошивки.
  • Дождитесь завершения процесса (1-7 часов в зависимости от выбранной скорости). В конце камера выключится.
  • Сохраните данные в PCM-файл (8-битные беззнаковые необработанные данные, не WAV!).
  • Обработайте файл с помощью adc.exe . Вы получите файл дампа.
  • Запустите dec.exe. Вы получите файл dump.dat. Это файл прошивки.


Регулировка скорости / сигнала:
Может потребоваться выполнить некоторые регулировки в зависимости от используемой камеры / светодиода / приемника. Основная идея — получить «читаемый» сигнал, как показано на картинке выше.
Вот значения для определенных скоростей и светодиоды для A610:

 A610 - Луч автофокусировки, БЫСТРО (9230 бод) [96 кГц]
--------------------------
fw:
  #define DELAY_SYNC 45
  #define DELAY_SPACE 50
  #define DELAY0 1
  #define DELAY1 25
декодировать:
  #define LEVEL_THRES_HI 0xA0
  #define LEVEL_THRES_LO 0x80
  #define LEN_SYNC 5
  #define LEN_SPACE 1
  #define LEN_0 1
  #define LEN_1 6
A610 - Луч автофокусировки, МЕДЛЕННЫЙ (2500 бод) [96 кГц]
-------------------------
fw:
  #define DELAY_SYNC 400
  #define DELAY_SPACE 100
  #define DELAY0 100
  #define DELAY1 200
декодировать:
  #define LEVEL_THRES_HI 0xA0
  #define LEVEL_THRES_LO 0x80
  #define LEN_SYNC 40
  #define LEN_SPACE 5
  #define LEN_0 12
  #define LEN_1 24
A610 - BLUE_led (1600 бод) [11 кГц]
-------------------------
fw:
  #define DELAY_SYNC 400
  #define DELAY_SPACE 175
  #define DELAY0 150
  #define DELAY1 350
декодировать:
  #define LEVEL_THRES_HI 0x90
  #define LEVEL_THRES_LO 0x70
  #define LEN_SYNC 7
  #define LEN_SPACE 1
  #define LEN_0 1
  #define LEN_1 4
 

Решение для загрузки последовательного порта []

Вы можете загрузить (моргнуть) прошивку, используя последовательный порт вашего компьютера вместо звуковой карты в качестве устройства ввода.Вам может потребоваться фотодиод, подключенный к последовательному порту согласно следующей схеме:


Используемый фотодиод — стандартный. Возможно, вам придется проверить расстояние до светодиода автофокуса камеры, который вам больше подходит, моя работала правильно на расстоянии около 20 см (8 дюймов), YMMV. (дополнительная информация: мигание светодиода не видно, потому что он очень быстрый, но все же отлично читается фотодиодом, так что не беспокойтесь). Сопротивление в схеме, показанной выше, составляет 10 кОм.В зависимости от фотодиода сопротивление также должно составлять 200 Ом для наилучшего использования.

Вам также понадобятся программы для мигания камеры и загрузчика последовательного порта. Вы можете найти оригинальную версию, написанную на Паскале , здесь . Другая преобразованная версия для Java с CRC16 доступна здесь.

Первая версия содержит эти две части:

  1. Камера: PS1.fir и PS2.fir , которые являются поворотниками камеры для Canon Powershot G7. Он был разделен на две части для упрощения повторения загрузки в случае сбоя (для каждой загрузки требуется около 40 минут для G7).Думаю, здесь вы можете использовать собственный поворотник камеры.
  2. PS: load.exe — программа-приемник для Windows. Синтаксис:
 load <номер последовательного порта> <имя файла дампа>
 

Вторая версия содержит эти две части:

  1. Камера: Исходный код main.c, который нужно собрать для вашей камеры. Подробности см. В Readme.txt.
  2. ПК: Скомпилированная программа на Java Load.class. Подробности см. В Readme.txt.

В качестве альтернативы загрузке .exe / Load.class вы можете использовать realterm как для мониторинга последовательного порта, так и для одновременного захвата файла. Убедитесь, что вы настроили его так:

  • Display tab: Hex + Ascii, установите «Scrollback» для 2000 строк или около того, также увеличьте количество строк.
  • Вкладка порта : 9600 8N1 (скорость передачи 9600 бит в секунду, 8 бит, без контроля четности, импульс с 1 остановкой в ​​конце байта), установите номер последовательного порта и не забудьте, что нажмите » Изменять».
  • Вкладка Capture : имя файла, в которое вы хотите выполнить дамп, снимите отметку «Direct Capture», если хотите посмотреть, как это происходит.
  • Контакты вкладка: Убедитесь, что находится в состоянии «Очистить» DTR (4) (сигнал готовности терминала сброса данных используется, если во время передачи используется «аппаратное дрожание руки»).

Во время захвата вы можете видеть рост файла и скорость в строке состояния внизу. Это должно быть около 800 CPS (символов в секунду).

Реальное действие:

  1. Подключите фотоприемник к последовательному порту компьютера.
  2. Правильно совместите светодиод AF и фотодиод приемника.
  3. Запустить load.exe . в командной строке. У вас есть 10 секунд, чтобы запустить мигание, иначе он отключится. В качестве альтернативы: нажмите «начать перезапись», чтобы начать захват в realterm , здесь нет тайм-аута.
  4. Запустите «прошивку» мигалки в камере, следуя обычной процедуре обновления прошивки. Вы должны увидеть, как загорится индикатор AF, и load.exe будет записывать данные в терминал …
 C: \> загрузить com1 firmware1.ель
Получено 1кбайт.
Получено 2кбайт.
...
Получено2048кбайт.
 

load.exe завершится по таймауту через 10 секунд после окончания мигания. Для realterm вам нужно будет вручную остановить захват, когда светодиод AF погаснет. После этого перезагрузите аккумулятор камеры. Для G7 вам может потребоваться повторить описанную выше процедуру с помощью PS2.fir, чтобы получить вторую часть прошивки. Откройте загруженные файлы прошивки в HEX Editor и отключите в информации (….. xx xx xx begin), а загрузите (конец.). Теперь у вас есть два файла со всеми необходимыми данными. Чтобы соединить два файла, просто сделайте «copy firmware1.fir + firmware2.fir Firmware.bin», и у вас на руках будет один файл прошивки.

Проводное решение: Вы также можете пойти на хардкор и открыть камеру и поискать соединения светодиодов (фототранзистор вам не понадобится), чтобы получить более надежное соединение. Если вы достаточно смелы, вы можете найти инструкции здесь.

Начальные адреса ПЗУ []

Известные начальные адреса ПЗУ:

0xFF000000 Используется некоторыми камерами с 2011 г.
0xFF810000 Большинство 2010 г. и более ранних серий S, SD, G и некоторые A-серии
0xFFC00000 В основном более старая серия A

Лучшие практики — при настройке устройства дампа с использованием типа дампа с поддержкой микропрограмм

Ступеньки

Когда происходит неожиданная остановка системы, средство создания дампа системы автоматически копирует выбранные области данных ядра на основное устройство дампа.Файлы дампа необходимы для анализа первопричин сбоя системы или полного зависания системы.


Чтобы просмотреть информацию о текущих устройствах дампа и тип дампа , введите команду:

#sysdumpdev -l

Примеры:


Есть два устройства дампа (первичное и вторичное ).

Если параметр устройства дампа — :

/ dev / hd6: Итак, пространство подкачки LV используется как устройство дампа.
/ dev / dumplv: Это другое имя LV. Определено выделенное устройство дампа.
/ dev / sysdumpnull: устройство дампа не определено. Это пустое устройство, и любой дамп, записанный на это устройство, теряется, и создается либо пространство подкачки, либо выделенное устройство для дампа.


Тип дампа


Тип дампа: с поддержкой fw : это означает, что предпочтительным типом дампа является системный дамп с помощью встроенного ПО.

Тип дампа: fw-assisted (suspend): это означает, что предпочтительным типом дампа является системный дамп с помощью встроенного ПО, но основное устройство дампа либо не настроено, либо не поддерживает дамп системы с помощью встроенного ПО.В последнем случае срабатывает традиционный дамп системы.

Тип дампа: традиционный: Только традиционный системный дамп доступен после команды sysdumpdev -t Traditional. Это также может быть связано с тем, что дамп системы с помощью встроенного ПО не поддерживается в этой системе. Для поддержки системного дампа с помощью встроенного программного обеспечения при запуске системы должно быть достаточно памяти, а также должно быть установлено оборудование POWER6® или более поздней версии и поддерживаемая встроенная программа.

Учитывайте следующие моменты при настройке устройства дампа с использованием типа дампа с поддержкой микропрограмм.

1- Если в качестве устройства дампа используется устройство подкачки по умолчанию hd6 (пространство подкачки), опция дампа с помощью встроенного ПО не работает. Вместо этого запускается традиционный системный дамп.


2- Вы не можете использовать системные дампы с микропрограммой для вторичного устройства дампа.


— Если в вашей системе меньше 4 ГБ памяти, устройством дампа по умолчанию является логический том / dev / hd6, который является логическим томом подкачки.

Кроме того, если конфигурация предназначена для системного дампа с помощью встроенного программного обеспечения, вы не можете настроить логический том / dev / hd6 в качестве устройства дампа.Для использования дампа с поддержкой микропрограмм необходимо настроить выделенный логический том.


-Если создается дамп в пространстве подкачки (только традиционные системные дампы), система автоматически копирует дамп при перезагрузке системы. По умолчанию дамп копируется в каталог / var / adm / ras корневой группы томов.


Что такое каталог копий? ( неприменимо, если вы используете выделенное устройство для дампа. )
Это каталог в файловой системе, куда копируется файл дампа, когда устройство дампа настроено на устройство подкачки hd6.


Флаг принудительного копирования ( не применяется, если вы используете выделенное устройство дампа )


Этот флаг используется, только если устройство дампа установлено на пространство подкачки hd6. Если TRUE, выдается приглашение разрешить копирование дампа на внешний носитель, если по какой-то причине возникает проблема, когда система копирует дамп в каталог копирования. Если ЛОЖЬ, не выводится никаких подсказок или уведомлений, если есть проблема с копированием дампа в каталог копий, и дамп утерян.

Сообщение об ошибке: Не удалось скопировать дамп из / dev / hd6 в / var / adm / ras.

/ dev / hd6 — это пространство подкачки, поэтому при запуске системы файлы дампа необходимо скопировать в / var / adm / ras, чтобы hd6 можно было использовать в качестве пространства подкачки. Если по какой-то причине возникает проблема при копировании файлов дампа в каталог копирования, при загрузке вас попросят скопировать содержимое hd6 (файлы дампа) на внешнее устройство.

Не пропускайте это сообщение и копируйте содержимое (файлы дампа) на внешний носитель.

Служба поддержки IBM рекомендует использовать тип с поддержкой микропрограмм:

Мы рекомендуем вам изменить тип дампа на сервере с традиционного на тип с поддержкой микропрограмм,

Преимущество дампа с поддержкой микропрограмм заключается в том, что дамп записывается во время перезагрузки системы после обнаружение устройства, в то время как традиционный тип записывается сразу же, когда сервер выходит из строя (сбой сервера).

Обновлено: 20.09.2021 — 09:32

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *