理解STM32L151的反汇编固件

逆向工程 手臂
2021-06-13 12:30:18

几天来我一直在整理反汇编代码,我有几个问题。

注意:这是我的第一个逆向工程副项目,如果这些是新手问题,我深表歉意......

1)我写了一个简单的程序,使STM32F4板上的LED闪烁(这不是我正在开发的板),编译代码,并查看IDA中的hex文件。在十六进制视图中,我看到了一些清晰的文本,如下所示:

..Q..<...8pG../s
ystem/src/stm32f
4-hal/stm32f4xx_
hal_cortex.c....
../system/src/st
m32f4-hal/stm32f
4xx_hal_gpio.c..
................
../system/src/st
m32f4-hal/stm32f

当我在 IDA 的十六进制视图中查看来自 STM32L151 板的反汇编二进制文件时,我没有看到任何可读字符的痕迹。这是否意味着固件被混淆了(编程板售价 60 美元,所以我不会感到惊讶)?

2) IDA 无法识别入口点,所以我正在筛选反汇编文件以寻找任何有趣的东西(如函数)。我以前在汇编中编程过,但是固件的第一行对我来说没有任何意义。它由连续的 STR 操作组成……它存储什么?它几乎做了 50 次相同的操作!?此外,它具有 EQ 条件,但我看不到它在比较什么。我链接的起始代码不是开发板独有的,STM32F4 十六进制文件以类似的方式启动。

3) 当我在“IDA View-A”中查看反汇编的固件时,我点击了“C”键后的向下箭头以查看汇编代码,但某些代码仍为 DCB 操作。这是为什么?示例在这里

4) 是否有专门寻找切入点的指南?大量的汇编代码让我不知所措。

1个回答

您在这里有两个主要问题:

1) 固件的开始是数据(中断向量表),而不是代码
2) Cortex-M 使用 Thumb 模式指令而不是经典的 ARM。

通常,当您将 ARM 二进制文件加载到 IDA 中时,您会收到以下消息:

---------------------------
Information
---------------------------
 ARM AND THUMB MODE SWITCH INSTRUCTIONS

 This processor has two instruction encodings: ARM and THUMB.
 IDA allows to specify the encoding mode for every single instruction.
 For this IDA uses a virtual register T. If its value is zero, then
 the ARM mode is used, otherwise the THUMB mode is used.
 You can change the value of the register T using
 the 'change segment register value' command
 (the canonical hotkey is Alt-G)

---------------------------
OK   
---------------------------

在您的情况下,整个文件都是 Thumb,因此您可以在顶部将 T 设置为 1。然后您需要按照第二个双字(重置向量)找到初始入口点。理想情况下,你应该得到类似的东西:

ROM:00000000   DCD 0x200002F8
ROM:00000004   DCD _reset+1

 ROM:00001480 _reset                      
ROM:00001480    BIC.W   R1, SP, #7
ROM:00001484    MOV     R0, SP
ROM:00001486    MOV     SP, R1
ROM:00001488    PUSH    {R0,LR}
ROM:0000148A    MOVS    R2, #0
ROM:0000148C    LDR     R1, =0x20000000
ROM:0000148E    LDR.W   R12, =0x20000000
ROM:00001492    LDR     R0, =0x2440
ROM:00001494    B       loc_149C
ROM:00001496 ----------------------------
ROM:00001496    LDR     R3, [R0,R2]
ROM:00001498    STR     R3, [R1,R2]
ROM:0000149A    ADDS    R2, #4
ROM:0000149C
ROM:0000149C    ADD.W   R3, R1, R2
ROM:000014A0    CMP     R3, R12
ROM:000014A2    BCC     loc_1496
ROM:000014A4    LDR     R3, =0x20000000
ROM:000014A6    LDR     R1, =0x200001F8
ROM:000014A8    MOVS    R2, #0
ROM:000014AA    B       loc_14B0
ROM:000014AC ----------------------------
ROM:000014AC
ROM:000014AC    STR.W   R2, [R3],#4
ROM:000014B0
ROM:000014B0    CMP     R3, R1
ROM:000014B2    BCC     loc_14AC
ROM:000014B4    BL      sub_244
ROM:000014B4 ; End of function _reset