Как считать программу с микроконтроллера
Перейти к содержимому

Как считать программу с микроконтроллера

  • автор:

 

Как считать программу с микроконтроллера

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

Необходимо знать назначение ножек преобразователя. Это описано на 2-й странице даташита.

Распиновка разъема программатора такова: avr_isp.jpg

ПРОГРАММИРУЕМ С UNIPROF

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

Внешний вид микроконтроллера

По микроконтроллерам AVR, семейств Mega и Tiny, есть много информации в интернете, и огромное количество готовых схем и прошивок для них. Выбравшие для изучения AVR микроконтроллеры (МК), думаю, чаще всего собирают себе, сперва для прошивания МК Программатор Громова. Это очень легкий в сборке программатор, не содержит дефицитных деталей, не требует наладки, и собрать его может даже школьник. Главным недостатком его является то, что для его подключения к компьютеру необходим СОМ порт, который часто отсутствует на современных компьютерах. Я являюсь обладателем относительно современного системного блока, на материнской плате которого производители оставили СОМ порт, и разумеется, собрал себе Программатор Громова, начав свое знакомство с МК AVR.

Программатор Громова самодельный

Выбор оболочек работающих с этим программатором не велик, наиболее распространенные, это Ponyprog и Uniprof. Испробовав в работе обе из них, понял, что к Ponyprog, у меня почему-то душа не лежит, зато Uniprof меня полностью устроила. Так выглядит её рабочее окно:

Рабочее окно программы Uniprof

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

Иконки программы Uniprof

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

  • READ. Считать прошивку с микроконтроллера. Кликнув по этой иконке, мы считываем записанную ранее прошивку, с чипа микроконтроллера в буфер программы.
  • PROG. Записать прошивку в микроконтроллер. С помощью этой иконки мы записываем прошивку, из буфера программы в память чипа, или прошиваем МК.
  • TEST. Сверка прошивки, записанной в память чипа, с прошивкой в буфере программы.
  • FUSE. Выставление фьюзов. Установка фьюз битов, задающих параметры работы микроконтроллера. О них ниже поговорим отдельно.
  • ERASE. Стереть прошивку микроконтроллера. Перед тем, как залить в чип новую прошивку, мы должны удалить старую из его памяти. С помощью этой иконки, мы и осуществляем стирание.
  • HEX Загрузить прошивку в буфер, (иконка папки). Перед тем как прошить микроконтроллер, мы должны загрузить прошивку в буфер программы, сделать это можно с помощью этой иконки.
  • HEX Сохранить прошивку из буфера (иконка дискеты). Служит для сохранения на компьютере прошивки, снятой с чипа микроконтроллера, и загруженной в буфер. Сохранить прошивку можно, только если микроконтроллер не был защищен от копирования его прошивки, с помощью выставления определенных фьюз битов.

Рассмотрим что это такое, фьюз биты. Такое окно появляется, если мы кликнем на иконку Фьюзы:

Окно Унипроф

У некоторых типов микроконтроллеров, часть фьюзов представленных на скрине может отсутствовать, у других наоборот, могут быть дополнительные фьюзы, которых нет на этом рисунке. Фьюзы делятся на несколько групп: Перечислим их так, как они идут на рисунке, слева направо, это Lock Байт, установка lock битов, защищает прошивку от копирования, Low Байт, это Младший байт. High Байт, это Старший байт. Ext Байт, это Дополнительный байт.

Список фьюзов Тини 2313

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

Онлайн калькулятор фьюзов

При выставлении фьюзов, нужно быть очень внимательным, потому что ошибочное выставление некоторых из них, приведет к тому, что микроконтроллер залочится, и перепрошить его через последовательный интерфейс (SPI) будет невозможно. В таком случае если вы все же напутали с выставлением фьюзов, поищите среди своих знакомых радиолюбителя, с параллельным (высоковольтным) программатором или Реаниматором МК AVR. Также, если вы случайно выставили тактирование, не от внутреннего генератора МК, а от внешнего кварца, и микроконтроллер перестал быть “виден” при прошивании, нужно будет подключить кварц и 2 конденсатора в соответствии со схемой и распиновкой из даташита.

Фузы которые изменять осторожно

Выше на рисунке, обведены красным те фьюзы, которые изменять не нужно, иначе микроконтроллер залочится. Это RSTDISABLE, выбор этого бита, отключает работу вывода RESET, и превращает его в еще один вывод порта микроконтроллера. SPIEN, этот бит, собственно и включает последовательное программирование. В некоторых программах-оболочках стоит защита от его изменения. DWEN, это бит служащий для отладки микроконтроллера, если его изменить, МК будет также недоступен для программирования по SPI. Также нужно обратить внимание, что в некоторых программах-оболочках, фьюз биты выставляются инверсно, Uniprof относиться именно к таким программам. То есть в одних, наличие галочки означает, что бит не запрограммирован, а в других наоборот. Для того что не ошибиться, можно ориентироваться по биту Spien, есть на нем галочка или нет, так как если микроконтроллер виден, бит Spien запрограммирован, этот бит бывает установлен по умолчанию. В программе-оболочке Ponyprog, галочки ставятся инверсно относительно Uniprof. Автор статьи — AKV.

Originally posted 2018-10-24 00:00:00. Republished by Blog Post Promoter

Считывание защищенной прошивки из флеш-памяти STM32F1xx с использованием ChipWhisperer

В предыдущей статье мы разбирались с Vcc-glitch-атаками при помощи ChipWhisperer. Нашей дальнейшей целью стало поэтапное изучение процесса считывания защищенной прошивки микроконтроллеров. С помощью подобных атак злоумышленник может получить доступ ко всем паролям устройства и программным алгоритмам. Яркий пример – взлом аппаратного криптокошелька Ledger Nano S с платой МК STM32F042 при помощи Vcc-glitch-атак.

Интересно? Давайте смотреть под кат.

О возможности считывания защищенной прошивки мы узнали из статьи, в которой приведены результаты выполнения Vcc-glitch-атаки – обхода байта защиты RDP через масочный загрузчик (bootloader) для нескольких микроконтроллеров (далее – МК). Также рекомендуем к прочтению статью о взломе ESP32.

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

Так же, как и в первой статье, мы решили проводить эксперименты на плате МК STM32F103RBT6:

Возможность записи данных в сектор флеш-памяти и RAM-памяти или их чтения, а также выполнения других действий с памятью МК определяется значением байта защиты (для STM32 – RDP). Для разных МК значения и назначение байтов защиты, а также алгоритм их проверки различается.

Аппаратная настройка

Приступим к проведению эксперимента. Для начала необходимо подключить ChipWhisperer к МК согласно рисунку:

Схема подключения ChipWhisperer к STM32 для считывания защищенной прошивки через масочный загрузчик

На схеме зачеркнуты элементы, которые следует удалить из платы STM32F103RBT6 (в отличие от стандартного подключения МК). Стрелками обозначены места подключения ChipWhisperer, а подписями – его пины.

Наличие внешнего кварца, представленного на схеме, не обязательно, поскольку при работе с масочным загрузчиком плата МК STM32F103RBT6 использует внутренний CLOCK с частотой 24 МГц, поэтому синхронизация между ChipWhisperer и МК отсутствует.

Перейдем к настройке ChipWhisperer. Как уже было отмечено выше, рекомендуемая частота работы ChipWhisperer – 24 МГц (или другое кратное значение). Чем выше кратность этой частоты, тем точнее можно настроить момент атаки. Из-за отсутствия синхронизации подбор параметра scope.glitch.offset необязателен, ему можно присвоить любое значение.

Параметры scope.glitch.repeat и scope.glitch.width необходимо подбирать в зависимости от установленной частоты ChipWhisperer. При большом значении частоты все кратковременные импульсы, количество которых устанавливается при помощи scope.glitch.repeat, сливаются в один длительный импульс. Поэтому можно подбирать значение параметра scope.glitch.width, а scope.glitch.repeat зафиксировать, либо наоборот. Мы обнаружили, что оптимальная длительность импульса должна составлять около 80 нс (определяется как ширина импульса на его полувысоте).

Осталось подобрать значение параметра scope.glitch.ext_offset.

Подбор scope.glitch.ext_offset

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

Алгоритм ответа на запрос о чтении данных сектора флеш-памяти

Чтобы удостовериться в верности такой схемы проверки, мы считали исполняемый код загрузчика подобного МК без защиты RDP через ST-Link. На рисунках ниже показаны части алгоритма обработки команды Read Memory command.

Общий вид обработки команды чтения памяти (хорошо видны вызов функции проверки RDP и посылка NACK в случае неудачной проверки)

Тело функции проверки RDP

 

Обратим внимание на тело функции проверки RDP: видно, что происходит чтение регистра по адресу 0x40022000 + 0x1C , логический сдвиг на 30 разрядов и ветвление. Из документации PM0075 Programming manual (STM32F10xxx Flash memory microcontrollers) становится понятно, что 0x40022000 – это базовый адрес контроллера flash memory, а 0x1C – это смещение регистра FLASH_OBR, в котором нас интересует второй бит RDPRT: Read protection, в котором содержится статус защиты RDP.

Необходимый момент проведения атаки – отработка инструкции LDR (загрузки из памяти). Эта инструкция располагается между запросом на чтение прошивки (отправление байта 0x11 с контрольной суммой 0xEE ) и ответом ACK / NOACK МК по UART. Для того чтобы визуально зафиксировать этот момент, необходимо подключить осциллограф к UART1_RX (пин PA10) и UART1_TX (пин PA9), а затем отслеживать изменение напряжения по UART1. В результате осциллограмма атаки по питанию с подобранным значением scope.glitch.ext_offset должна выглядеть примерно так:

Выбор момента проведения атаки

Скрипт считывания прошивки

Теперь необходимо указать момент срабатывания триггера CW_TRIG в коде Python с целью перехвата момента передачи контрольной суммы по UART1_RX. У ChipWhisperer есть библиотека для общения с масочным загрузчиком МК STM32. В штатном режиме эта библиотека используется для загрузки на МК прошивок из руководств при помощи класса class STM32FSerial(object) , расположенного в файле programmer_stm32fserial.py по пути software/chipwhisperer/hardware/naeusb/ . Для активации срабатывания триггера необходимо скопировать этот класс в главный исполняемый скрипт, чтобы метод класса CmdGeneric(self, cmd) стал глобально доступным, и добавить команду scope.arm() до передачи контрольной суммы (0xEE) запроса на считывание сектора памяти. Итоговый класс приведен в спойлере ниже.

Следует обратить внимание на то, что масочный загрузчик STM32F1хх позволяет считывать за один запрос не более 256 байт прошивки из указанного сектора флеш-памяти. Поэтому при считывании всей прошивки МК необходимо в ходе Vcc-glitch-атаки выполнить несколько запросов на чтение. Затем полученные 256 байт следует разбить на восемь 32-байтных массивов и сформировать из них файл формата HEX.

Настройка параметров ChipWhisperer завершена. Итоговый скрипт на считывание прошивки выглядит следующим образом:

Все закомментированные сообщения print() после строчки except Exception as помогают отслеживать состояние МК при поиске оптимальных параметров glitch-импульса. Для отслеживания конкретного состояния МК достаточно раскомментировать необходимое сообщение print() .

Результаты считывания

На видео продемонстрирована загрузка прошивки на МК через программатор ST-LINK, перевод RDP в состояние защиты и последующее считывание прошивки:

Успешному проведению Vcc-glitch-атаки могут помешать следующие ошибки:

• считывание неверного сектора памяти;

• самопроизвольное удаление прошивки.

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

После разработки и отладки алгоритма считывания защищенной прошивки мы провели тестовое считывание прошивки программатора ST-LINK-V2.1, который работает на МК STM32F103CBT6. Считанную прошивку мы зашили на «чистый» МК STM32F103CBT6 и установили его вместо заводского. В результате ST-LINK-V2.1 с замененным МК работал в нормальном режиме, будто подмены не было.

Также мы попробовали провести серию атак на STM32F303RCT7. Этот МК в ходе атаки вел себя идентично STM32F103RBT6, но ответ на запрос чтения памяти содержал байт, равный 0х00, что не совпадало с ожидаемым нами результатом. Причина такой неудачи заключалась в более сложном и развитом принципе организации защиты этих МК.

В МК STM32F1xx существует два состояния защиты: защита выключена (Level 0) и включена (Level 1). В старших моделях предусмотрено три состояния защиты: защита отключена (Level 0, RDP = 0x55AA), защита флеш- и SRAM-памяти (Level 2, RDP = 0x33CC) и защита только флеш-памяти (Level 1, RDP принимает любые значения, отличные от 0x55AA и 0x33CC). Поскольку Level 1 может принимать множество значений RDP, установить Level 0 достаточно тяжело. С другой стороны, существует возможность понижения уровня защиты с Level 2 на Level 1 сбиванием одного бита в байте RDP (показано на рисунке ниже), что открывает доступ к SRAM-памяти.

Сравнение значений RDP для разных уровней защиты прошивки

Остается только понять, как этим может воспользоваться злоумышленник. Например, с помощью метода CBS (Cold-Boot Stepping), описанного в этой статье. Этот метод основан на поэтапном снимке состояния SRAM-памяти (периодичность выполнения каждого снимка была в районе микросекунды) после загрузки МК с целью получения ключей шифрования, скрытых паролей или любой другой ценной информации. Авторы предполагают, что метод CBS сработает на всех сериях МК STM32.

Выводы

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

Vcc-glitch-атаки опасны тем, что от них сложно защититься. Для уменьшения вероятности успешного проведения подобных атак предлагается использовать МК с более высоким уровнем защиты.

Raccoon Security – специальная команда экспертов НТЦ «Вулкан» в области практической информационной безопасности, криптографии, схемотехники, обратной разработки и создания низкоуровневого программного обеспечения.

USBasp | AVRDUDE | Программирование микроконтроллеров AVR

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

Чтобы перенести нашу программу с компьютера в микроконтроллер нам понадобится программатор USBasp и программа AVRDUDE. Сегодня существует широкий выбор программаторов, предназначенных для программирования микроконтроллеров AVR. Среди них можно найти много самодельных, который даже трудно назвать программаторами, поскольку они с помощью всего лишь нескольких резисторов напрямую подключаются к COM порту. Однако современные компьютеры и ноутбуки уже практически не оборудываются COM портами, поэтому одним из основных критериев при выборе программатора является возможность подключения его к USB порту. Наиболее дешевый, простой и очень распространенный – это программатор USBasp. Его можно приобрести практически в любом радиомагазине по доступной цене. Стоимость его в китайских интернет магазина находится в пределах от 1,5 $ до 3 $.

Программатор USBasp

Связь компьютера с микроконтроллером осуществляется посредством программатора USBasp через USB порт, а данные передаются по интерфейсу SPISerial Peripheral Interface (последовательный периферийный интерфейс). Для связи МК с программатором задействуются специальные выводы: MOSI, MISO, SCK, RESET, VCC, GND. Хотя SPI предполагает использование всего трех выводов MOSI, MISO и SCK, но мы будем задействовать все шесть выводов.

Интерфейс SPI

При обмене данными по интерфейсу SPI микроконтроллер может одновременно либо принимать (вывод MISO) либо передавать данные (вывод MOSI). Установка режима приема или передачи данных осуществляется путем подачи определенного импульса на вывод SCK.

Разъем программатора, как правило, имеет 10 пинов и подключается к микроконтроллеру с помощью 10 проводного шлейфа. Однако удобней пользоваться шлейфами, которые имеют переходник на 6 пин, так как в таком случае все пины заняты. У десяти пинового разъема одни пин остается не занятым, а четыре пина подключены к общему проводу (GND).

Разъемы программатора USBasp

Маркировка разъемов USBasp

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

Фото подсоединенного программатора к микроконтроллеру ATmega8 приведено ниже.

Программирование микроконтроллеров AVR

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

Настройка AVRDUDE

Теперь нам осталось выполнить финальный шаг. Запускаем программу AVRDUDE. По умолчанию открывается вкладка Program. В нижней части окна в меню Настройки выбираем тип программатора usbasp. Далее в категории Микроконтроллер выбираем наш микроконтроллер ATmega8. Ниже, в категории Flash кликаем по значку троеточия и в открывшемся меню указываем путь к скомпилированному файлу с расширением hex. Путь к файлу и сам файл будут теми же, что мы ранее задавали в Proteus.

Настройка AVRDUDE

Чтобы убедится в том, что программатор определен операционной системой (драйвер программатора корректно установлен) и правильно подключен к микроконтроллеру, кликаем по кнопке Чтение. Если ошибок нет, то появится окно с записью “Калибровочные ячейки генератора считаны!” И в верхнем окошке отобразится шестнадцатеричное число. У каждого МК это число индивидуальное.

AVRDUDE

Прежде, чем записать новую программу рекомендуется очистить память микроконтроллера. Это можно сделать, кликнув по кнопке Стереть все. В результате появится окно с сообщением о том, что кристалл чист.

AVRDUDE Очистка памяти микроконтроллера

Теперь кликаем по кнопке Программировать в категории Flash. При успешной записи программы в МК появляется окно с записью, приведенной ниже.

AVRDUDE Прошивка микроконтроллера

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

Прошивка микроконтроллера ATmega8

Первая наша программа очень проста, а частота работы микроконтроллера оставлена по умолчанию и для ATmega8 равна 1 МГц. В случае изменения частоты или подключения внешнего кварцевого резонатора, необходимо внести некоторые изменения во вкладке Fuses, путем установки галочек в соответственные чекбоксы CKSEL0… CKSEL3.

AVRDUDE Фьюзы Fuses

Подробно настройки данной вкладки мы рассмотрим в статье Fuses (биты настройки или биты защиты) микроконтроллера.

 

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

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