Enriched reverse engineering STM32 firmware

Enriched reverse engineering STM32 firmware

5 March 2019
Embedded, AppSec

Black pill
Black pill

В першій публікації ми розповіли відносно простий сценарій статичного аналізу прошивки без будь-якої додаткової інформації (stripped binary). Надалі в тексті очікується, що ви її прочитали - Reverse engineering STM32 firmware


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

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

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

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

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

0x00 r2 zignatures #

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

aa  
zg  
zos symbols.file

Generate and save zignatures
Generate and save zignatures

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

zo ./symbols.file  
aaa
zi

Load zignatures
Load zignatures

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
Підгрузили пустий файл розміром 512кБ в початок SRAM

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

yt 464 0x20000000 @ 0x800cb78
pxw @0x20000000

частина SRAM
частина SRAM

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

Materials #


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