Enriched reverse engineering STM32 firmware
5 March 2019
В першій публікації ми розповіли відносно простий сценарій статичного аналізу прошивки без будь-якої додаткової інформації (stripped binary). Надалі в тексті очікується, що ви її прочитали - Reverse engineering STM32 firmware
Хід виконання програми стає набагато очевидніший при використанні контекстних назв змінних та функцій. Для зіствалення пам’яті зі змінними програми бажано мати таблицю символів, котра є лише у розробників.
Частина функцій звичайної програми виконується ядром та бібліотеками операційної системи і проектується в пам’ять процесу компонувальником (linker) під час запуску. Це називається динамічне компонування. Зазвичай, в мікроконтролерах прошивка самодостатня, статично компонується з усіма бібліотеками та операційними системами реального часу в єдиний файл.
Виробники мікроконтролерів надають SDK, що містить системні бібліотеки для работи з компонентами мікроконтролера та тулчейн для збірки всього коду в готову прошивку та таблиці символів для подальшого відлагодження пристрою.
Алгоритм створення додаткової інформації для аналізу stripped binary наступний:
- Аналізуємо яка периферія використовується і на яких пінах.
- Створюємо власний проект під мікроконтролер, ініціалізуємо та використовуємо периферію з п1
- Компілюємо проект та беремо ELF файл в дизассемблер. ELF містить таблиці символів.
- Генеруємо сигнатури функцій та типів даних.
- Згенеровані сигнатури використовуємо при аналізі 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
Копіюємо частину з Flash у SRAM, як це робить мікроконтролер в функції ResetHandler. Зверніть увагу, що серед інформації пам’яті можна побачити вказівники на регіон Flash (0x0800xxxx)
yt 464 0x20000000 @ 0x800cb78
pxw @0x20000000
Тепер зазирнувши у функцію перевірки ліцензії (деталі описано в попередній публікації) ми побачимо тексти повідомлень та захардкоджений пароль для level1 нашого воркшопу.