NUCLEO-F103RB 보드 구매


최근, NUCLEO-F103RB 보드를 구매했습니다.

Nucleo Features

- STM32F103RBT6 LQFM64
- ARM® 32-bit Cortex®-M3 CPU
- 72 MHz max CPU frequency
- VDD from 2.0 V to 3.6 V
- 128KB Flash
- 20KB SRAM
- GPIO (51) with external interrupt capability
- 12-bit ADC (2) with 16 channels
- RTC
- Timers (4)
- USART (3)
- SPI (2)
- USB 2.0 full-speed
- CAN

Built-in Firmware

보드에 초기 펌웨어가 빌트인 되어 있어서, 어떤 녀석이 들어가 있나 덤프를 해봤습니다.

$ brew install stlink
$ st-flash read --debug read firmware.bin 0x08000000 9k

STM32F103RBT6은 0x08000000 주소에 플래시 메모리가 매핑됩니다.

memory-mapping

그리고 플래시 메모리에서 부팅하게 된다면, 0x00000000 주소에 플래시 메모리가 매핑되기 때문에, 0x08000000 대신 0x00000000에서부터 읽어도 동일한 결과를 얻을 수 있습니다.

9kB를 읽는 이유는, 펌웨어의 사이즈를 알 수 없어서 256kB 까지 읽어보니, 9kB 이후로는 0xFF로 초기화 되어 있었기 때문입니다. (256K를 다 읽어도 크게 상관은 없습니다.)

firmware.bin

STM32F103RBT6 MCU는 Cortex-M3 코어를 사용하니, isr_vector가 나타나는지 확인해보면 되겠습니다.

$ r2 -a arm -b 16 -m 0x08000000 firmware.bin

rarere2를 이용하여, 16비트 thumb 모드로 분석을 합니다. 로드 주소는 플래시 메모리 주소인 0x08000000 입니다.

우선, aaa 명령어로 분석을 시작합니다.

[0x08000000]> aaa
INFO: Analyze all flags starting with sym. and entry0 (aa)
INFO: Analyze imports (af@@@i)
INFO: Analyze symbols (af@@@s)
INFO: Analyze all functions arguments/locals (afva@@@F)
INFO: Analyze function calls (aac)
INFO: find and analyze function preludes (aap)
INFO: Analyze len bytes of instructions for references (aar)
ERROR: invalid memory at 0x08002400
INFO: Finding and parsing C++ vtables (avrr)
INFO: Analyzing methods (af @@ method.*)
INFO: Emulate functions to find computed references (aaef)
INFO: Recovering local variables (afva@@@F)
INFO: Type matching analysis for all functions (aaft)
INFO: Propagate noreturn information (aanr)
INFO: Use -AA or aaaa to perform additional experimental analysis
INFO: Finding xrefs in noncode sections (e anal.in=io.maps.x; aav)

그리고 isr_vector를 출력 해봅시다. 인터럽트 갯수를 정확히 알 수는 없으니, 대충 128바이트 정도 출력해봅니다.

[0x08000000]> pxw 128
0x08000000  0x20000960 0x080021d9 0x08001f6d 0x08001f6f  `.. .!..m...o...
0x08000010  0x08001f71 0x08001f73 0x08001f75 0x00000000  q...s...u.......
0x08000020  0x00000000 0x00000000 0x00000000 0x08001f77  ............w...
0x08000030  0x08001f79 0x00000000 0x08001f7b 0x08001f7d  y.......{...}...
0x08000040  0x08002245 0x08002249 0x0800224d 0x08002251  E"..I"..M"..Q"..
0x08000050  0x08002255 0x08002259 0x0800225d 0x08002261  U"..Y"..]"..a"..
0x08000060  0x08002265 0x08002269 0x0800226d 0x08002271  e"..i"..m"..q"..
0x08000070  0x08002275 0x08002279 0x0800227d 0x08002281  u"..y"..}"..."..

isr_vector의 첫번째 엔트리는 Initial Stack Pointer가 등장합니다.

isr_vector

SRAM의 끝 주소를 가리키는데, 이는 0x20000960 입니다. 이어서 Reset Handler의 위치인 0x080021d9가 등장합니다.

이제 각 Exception Handler로 주소를 점프해서 disassemble 해보면, Built-in 펌웨어가 어떤 동작을 하는지 알 수 있을 것입니다.

하지만, 지금은 그다지 궁금하지 않으니 여기까지만 하겠습니다.