Enriched reverse engineering STM32 firmware

Andrey Voloshin
TechMaker
Published in
3 min readMar 4, 2019

В першій публікації ми розповіли відносно простий сценарій статичного аналізу прошивки без будь-якої додаткової інформації (stripped binary). Очікується, що ви її прочитали https://medium.com/techmaker/reverse-engineering-stm32-firmware-ee677714d1a8

Хід виконання програми стає набагато очевидніший при використанні контекстних назв змінних та функцій. Для зіствалення пам’яті зі змінними програми бажано мати таблицю символів, котра є лише у розробників.

Частина функцій звичайної програми виконується ядром та бібліотеками операційної системи і проектується в пам’ять процесу компонувальником (linker) під час запуску. Це називається динамічне компонування. Зазвичай, в мікроконтролерах прошивка самодостатня, статично компонується з усіма бібліотеками та операційними системами реального часу в єдиний файл.

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

Алгоритм створення додаткової інформації для аналізу stripped binary наступний:

  1. Аналізуємо яка периферія використовується і на яких пінах.
  2. Створюємо власний проект під мікроконтролер, ініціалізуємо та використовуємо периферію з п1
  3. Компілюємо проект та беремо ELF файл в дизассемблер. ELF містить таблиці символів.
  4. Генеруємо сигнатури функцій та типів даних.
  5. Згенеровані сигнатури використовуємо при аналізі stripped binary.

0x00 r2 zignatures

Аналізуємо файл, генеруємо сигнатури, зберігаємо їх у файл

aa
zg
zos symbols.file

Відкриваємо stripped binary, підгружаємо сигнатури та дивимось на результат:

zo ./symbols.file
aaa
zi

0x01 Memory Map

Для статичного аналізу зручно використовувати емулятори коду. Емулюючи хід виконання код можливо збагатити додатковою інформацією.

Створимо пустий файл, в якому надалі буде вміст SRAM:

dd if=/dev/zero of=sram.txt count=512 bs=1024

Увімкнемо відображення результатів емуляції та встановимо значення stack pointer так, як зазначено в документації на мікроконтролер (перші 4 байта прошивки)

dr sp=0x20005000
e asm.emu = true
aer

Частина корисної інформації копіюється з Flash в RAM в самому початку виконання прошивки (entry0, він же ResetHandler). Спробуйте самостійно пройтись по виконанню і зрозуміти роботу регістрів та пам’яті.

Підгружаємо наш файл за адресою початку SRAM (0x20000000)

on ./sram.txt 0x20000000 rwx
Підгрузили пустий файл розміром 512кБ в початок SRAM

Копіюємо частину з Flash у SRAM, як це робить мікроконтролер в функції ResetHandler. Зверніть увагу, що серед інформації пам’яті можна побачити вказівники на регіон Flash (0x0800xxxx)

yt 464 0x20000000 @ 0x800cb78
pxw @0x20000000
частина SRAM

Тепер зазирнувши у функцію перевірки ліцензії (деталі описано в попередній публікації) ми побачимо тексти повідомлень та захардкоджений пароль для level1 нашого воркшопу.

Про такі речі ми пишемо на нашій сторінці TechMaker в Facebook та розповідаємо на курсах

--

--