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

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

  • автор:

STM32 Shellcode: firmware dump over UART

Alexander Olenyev

In one of the previous articles, we talked about stack overflow and overwriting the stack pointer to the desired function address — Stack Buffer overflow in STM32.

RCE (remote code execution) is a complete attack that uses such an exploit. In order to perform it, one writes shellcode functions to the buffer and puts the shellcode address to the stack pointer. As a result, the code that is written to the buffer gets executed.

And there the fun begins. To be honest, when preparing the article, we didn’t have an objective to write a complete shellcode solution, and that’s why we selected the buffer size randomly. Randomly small 🙂

O_o buffer size is 20 bytes plus some stack space for local variables. Later, we ended up with 32 bytes total (to be the same as that 32 x “.” from python script)

What can be packed into 32 bytes? ��

Challenge accepted, let’s do some shellcode. What is gonna be the purpose of shellcode? Let’s try to dump the whole chip firmware. We have USB and UART interfaces initialized. The latter is easier to work with, so let’s stick with UART as a channel to be used for dumping the firmware.

Algorithm for working with UART is the following:

  • wait for the flag UART_FLAG_TXE (Transmit Data Register Empty)
  • write the next byte of the firmware to the register UART->DR (data register)
  • increment the pointer to the next byte of the firmware
  • return to step one

In addition, we need to ensure the operability of our code:

  • need to allocate some space on the stack (decrement stack pointer)
  • write the valid address to the link register

In order to avoid checking the flag UART_FLAG_TXE in a loop, we can call HAL_Delay(1). The UART will work at 115200 kbps and 1-millisecond delay is just enough.

We could’ve looked up and used the function HAL_UART_Transmit() but then our shellcode will be dependant on the location of a certain function in the chip’s memory. We can do the same to replace HAL_Delay() with a waiting loop.

If we work directly with peripheral registers then our code will work independently from whether certain functions are present in the firmware or not. With literally 2–3 register writes we can enable UART and start transmitting data.

So, the final version of the shellcode will look something like this:

The code is easier to write code using C (even with assembly insertions), compile it and check the disassembly result. Then you can tweak it the way you want:

After packing the shellcode into the python script and some testing, we get the following code:

Avrdude. Как скачать, забэкапить и залить заново прошивку

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

Отписаться от уведомлений вы всегда сможете в профиле автора.

Но прежде чем писать умные мысли — всё надо проверять, чем я и занялся. Эксперименты я проводил с Arduino Mega 2560. О ней дальше я и буду писать.

Поначалу я попытался пойти привычным способом ‘влоб’, достал программатор китайский (на заглавной фотке), подключился по ISP, и скачал прошивку. Попытался её залить назад. Льётся, но верификацию не проходит. Битых несколько часов рыл интернет, чтобы понять, как же можно нормально скачать прошивку с Меги по ISP. Толком ничего вразумительного не нашёл, но зато понял, что прошивку можно скачать и залить обратно и без программатора. Об этом опыте я и напишу ниже. А вот о том, как скачивать прошивку не с Arduino платы, да так чтобы она потом назад заливалась я напишу как-нибудь в следующий раз, когда у меня появится плата, которую можно безбоязненно пускать и в огонь и в воду.

Ладно, к делу. Для начала нам нужна утилита Avrdude, она входит в поставку Arduino IDE и в моей версии лежала в папке ‘%appdata%Arduino15packagesarduino oolsavrdude6.0.1-arduino2in’. Открываем папку, жмём на пустом месте SHIFT + правая кнопка мыши, а в меню выбираем ‘Открыть окно команд’. Теперь приведу простую команду, которая проверяет, что контроллер читается.

Avrdude. Как скачать, забэкапить и залить заново прошивку

-p atmega2560 — установка типа контроллера.

-c wiring — установка программатора. Это внутренний программатор в плате Arduino Mega 2560. Может я и не правильно выразился, но тот же атрибут использует IDE, когда заливает скомпилированный скетч.

-P COM5 — настройка порта, в который воткнут USB шнурок от Arduin’ы. Подглядеть можно из IDE.

Дальше — скачаем ‘.hex’ файл с прошивкой из контроллера. Для этого воспользуемся командой:

Avrdude. Как скачать, забэкапить и залить заново прошивку

Новые атрибуты команды:

-b115200 — скорость порта для программатора.

Uflash:r:’printer_firmware’.hex:i — указание считать прошивку в файл ‘printer_firmware.hex’.

Считать считали, теперь её можно бэкапить, но вот как её восстановить потом? Да тоже ничего сложного, команда не будет сильно отличаться от чтения.

avrdude.exe -p atmega2560 -c wiring -PCOM5 -b115200 -D -Uflash:w:’printer_firmware’.hex:i

Avrdude. Как скачать, забэкапить и залить заново прошивку

Новые атрибуты команды:

-D — запрещает автоматическую очистку памяти микроконтроллера перед прошиванием.

-Uflash:w:’printer_firmware’.hex:i — указывает на то, что нужно записать в память данные из файла ‘printer_firmware.hex’.

Дальше я подключил свою Arduino Mega 2560 назад к рампам и проверил, что прошивка работает корректно. Как видите эксперимент хоть и частично, но удался. Так что и я и вы теперь знаете, как можно забэкапить прошивку из ATmega2560, что установлена на Arduino Mega2560.

Подпишитесь на автора

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

ESP8266 Урок 3. Читаем прошивку ESP-01. Часть 1

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

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

Для начала скачаем следующие визуальные инструменты:

  1. Flash Download Tools,
  2. ESPlorer,
  3. nodemcu-flasher (Nodemcu firmware programmer)

Данные программы найти не сложно, первый — на официальном сайте Espressif, второй — на сайте https://esp8266.ru/esplorer/ , а третий — на GitHub https://github.com/nodemcu/nodemcu-flasher .

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

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

Чтобы работать с контроллером ESP8266 в консоли, есть два пути. Первый — скачать готовый esptool для windows и работать с ним, но это не совсем правильно. Хотя бы потому, что самые свежие версии не так легко найти, так как разработчик данного инструмента установочные и исполняемые файлы в формате exe не хранит. Поэтому есть второй путь — установить Python, скачать esptool через инструментарий Python и затем пользоваться самой последней версией.

Для этого, если у нас ещё не установлен Python, или установлена старая версия, то необходимо его установить.

Скачиваем и устанавливаем последнюю версию интерпретатора с официального сайта Python

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

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

Если мы видим версию, значит Python «виден», а если видим что-то наподобие вот такого

то тогда перезагружаемся и проверяем ещё раз.

Если всё нормально, то продолжаем дальше.

Дальше надо будет установить утилиту esptool. Для этого используем следующую команду

Ниже мы видим совет обновить pip (инсталлятор пакетов). Ну, раз просят, давайте попробуем обновить

Теперь у нас ещё и обновлённый pip.

В принципе, я пробовал деинсталлировать после этого esptool, а затем его установить заново, ничего не изменилось, поэтому этого делать не обязательно.

Проверим доступность esptool, узнав его версию

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

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

Официальная прошивка от Espressif для пользования AT-интерпретатором состоит из нескольких файлов и адреса заливки их во FLASH-память ESP8266 зависят от объёма данной памяти, а также её организации.

Откроем мануал по использованию AT-команд и мы увидим в нём для нашего объёма FLASH-памяти следующую картину

Давайте считаем всю нашу FLASH-память из модуля.

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

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

Делается это в с помощью наших двух кнопок в следующем порядке

  1. Нажимаем и удерживаем кнопку сброса (RESET),
  2. Нажимаем и удерживаем кнопку прошивки (FIRMWARE),
  3. Отпускаем кнопку сброса (RESET),
  4. Отпускаем кнопку прошивки (FIRMWARE).

После данных действий наш модуль должен быть переведен в режим загрузки (выгрузки) прошивки.

Теперь, чтобы считать всю FLASH-память нашего ESP и сохранить её в файл, в командной строке мы вводим следующую строку

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

Теперь об остальных параметрах в строке

—port COM5 — тут, я думаю понятно, мы говорим утилите, что работать мы будем с портом COM5,

read_flash — а здесь мы говорим то, что мы будем именно читать из памяти FLASH

0x00000 0x100000 — читаем с адреса 0 байты размером в 1 мегабайт (в шестнадцатеричном выражении — 0x100000).

flash_esp01_full.bin — имя файла, в который сохранится наш дамп.

После того, как процесс считывания закончится, мы видим, что в нашей папке появился файл с дампом FLASH-памяти

В следующей части нашего урока мы выделим из считанного байта FLASH-памяти модуля ESP-01 файлы прошивки.

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

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

Детально показано, как считать прошивку PIC микроконтроллера через программатор PICkit 3, купить который можно здесь https://goo.gl/HrDmav. Ремонт, микроконтроллеры, прошить, Клавиатура,. Затем докупил Думаю возможно ли считать прошивку с его клавиатуры и залить на мою? В таком программы SinaProg 2.1 и USBasp S51AVR программатора считать и записать файлы прошивки HEX, файл EEPROM и Fuses в микроконтроллер .

Радио ФАНК — USBDM — uCoz

Средства программирования PIC-контроллеров / Хабрахабр

прошивка и отладка из под Windows, поэтому далее будем считать, что драйвер уже установлен. эту прошивку можно прошить в микроконтроллер: Наряду со знакомым форматом прошивок HEX, в stm32 широко используется Защита прошивки от копирования Допустим вы выпустили на рынок своё устройство и подключиться программатором к нашему устройству и считать прошивку, Конечно можно просто оторвать ножки микроконтроллера… но В своем проекте я использую микроконтроллер STM32F103C8 и фреймворк прошивку (через USB или UART, считать с флешки, принять со спутника,

Заливка прошивки в STM32 через USB / Geektimes

Средства программирования PIC-контроллеров / Хабрахабр

Программатор разработан для прошивки микроконтроллеров используемых Codewarrior, после чего можно считать дамп с нового микроконтроллера. Или может есть радиомодуль без микроконтроллера (чтобы не жрал лишнее), который бы я Например, мы хотим собрать прошивку под микроконтроллер STM32F103C8T6: Мог ли компилятор посчитать asm volatile(.

Немогу считать Flash с проца mc9s08ac32 / SW19

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

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