把固件加载与入口点定位落到固件加载的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。
固件加载与入口点定位用固件加载、入口点定位、处理平台3向量表连接到固件加载的调试、验证和交付动作。
在固件逆向工程中,加载二进制文件只是第一步,真正的挑战在于找到CPU执行的第一条指令。对于处理平台3内核的目标平台F103,这个起点并非传统x86架构的Reset Vector,而是由中断向量表(Interrupt Vector Table, IVT)和复位序列共同定义。本节的核心意图是解决一个典型故障:固件加载后,反汇编工具无法自动识别入口点,导致分析无法推进。我们将以Ghidra为平台,演示如何通过定位中断向量表,手工推导出复位处理函数入口,并验证堆栈指针(SP)的初始化值是否正确
处理平台3复位后,硬件自动从0x00000000加载SP,从0x00000004加载PC。因此,固件加载后的首要检查点不是代码段,而是向量表的前两个32位字
记录输入、环境、时序或操作动作,先保留现场证据。
优先保留日志、返回码、状态位或波形片段。
把命令、配置和日志放到同一时间窗口,再只调整一个会改变链路状态的条件。
把返回码、计数器和吞吐变化分开留存,避免把一次偶然恢复当成结论。
固件加载与入口点定位落地前要同时核对固件加载的入口点定位、失败路径和处理平台3向量表。
在Ghidra中加载目标平台F103固件时,通常选择“Binary”格式,并手动指定基地址为0x08000000(内部Flash起始地址)。加载完成后,立即检查地址0x08000000处的数据。根据处理平台3架构手册,该地址存放的是初始主堆栈指针(入口栈指针),而0x08000004存放的是复位向量(Reset Vector),即复位后第一条指令的地址。这是整个分析流程的动作入口点定位动作
实际操作中,使用Ghidra的“Memory”窗口查看原始字节。例如,若看到00 00 00 20(小端序,对应0x20000000),则SP被初始化为SRAM的末尾;若看到xx xx xx 08,则复位向量指向Flash区域。如果这两个值异常(例如全0或指向无效地址),则固件可能被加密、截断或加载地址错误。此时,需要检查固件文件头是否有偏移,或是否包含升级入口前缀
某次固件分析中,Ghidra自动分析后入口点为0x08000000,但反汇编代码全是无效指令。检查向量表发现,0x08000004处的复位向量为0x08000105(奇数地址,符合Thumb指令对齐要求)。手动跳转到该地址后,才看到正确的启动代码。此案例说明,依赖自动分析可能错过真正的入口点
在定位中断向量表后,需要一套判断标准来确认其有效性。以下检查清单用于快速排除常见问题:
| 检查项 | 标准 | 是否通过 | 常见遗漏 |
|---|---|---|---|
| 初始SP值 | 指向SRAM范围(目标平台F103通常为0x2000… | 是/否 | 未验证地址是否在RAM边界内 |
| 复位向量值 | 奇数(Thumb指令),且指向Flash范围(0x08… | 是/否 | 忽略地址对齐要求(LSB必须为1) |
| 异常向量连续性 | HardFault、SVCall等关键异常向量不为0 | 是/否 | 只检查前两个向量 |
确认向量表有效后,下一步是分析复位处理函数。复位向量指向的地址通常是汇编编写的启动代码(startup_xxx.s)。这段代码的核心任务包括:初始化堆栈指针、复制.data段、清零.bss段、调用SystemInit和main。在Ghidra中,跳转到复位向量地址后,应能看到连续的LDR、MOV和BL指令。一个典型的复位序列片段如下:
; 复位向量指向此处
08000105: LDR R0, =__stack_end ; 加载栈顶地址
0800010B: MOV SP, R0 ; 设置主堆栈指针
0800010D: BL SystemInit ; 初始化时钟和硬件
08000111: BL main ; 跳转到主函数这段配置属于“问题代码/原始配置”,核对键名、默认值、取值范围和修改后影响的行为。
上述代码中,__stack_end的值应与向量表中初始SP一致。如果发现MOV SP, R0被跳过或直接跳转到main,则说明固件可能使用了非标准启动流程(如直接运行在RAM中的代码)。此时,需要结合固件加载指标复盘来重新评估:是否漏掉了升级入口阶段的初始化?
在Ghidra中,使用“Go To”功能跳转到复位向量地址。如果反汇编结果看起来像数据而非代码,按D键重新定义为指令,并确认地址的LSB为1(Thumb模式)
继续推进固件加载与入口点定位时,先把固件加载对应到工程结构中的入口、依赖和输出,再确认入口点定位能不能复现当前结果。如果案例或数据变化,下一步不是马上改代码,而是先补一条最小验证,观察固件加载是否还能说明目标达成。交接材料应写清可保留部分、可替换部分和优先复查位置,让项目能从本节自然进入下一轮迭代。保留一条最小证据线:固件加载与入口点定位说明对象,源码结构说明约束,固件加载说明状态,最后用入口点定位判断能否继续推进。第03节的复盘出口是入口点定位,它要能说明固件加载与入口点定位、固件加载和项目成果之间哪一项先发生变化。