← 返回目录课程:《STM32H7高性能MCU固件逆向分析实战》
04

04 固件二进制结构解析:ELF、Hex与Bin格式互转与段分析

形成固件格式差异,使用objdump与readelf提取关键段
章节导航 难度:入门类型:概念框架
目标结果

把固件二进制结构解析落到固件二进制结构解析的触发条件、可观察状态和复查材料上,先判断问题从哪里收窄。

关键线索
接口配置流程状态日志
交付材料
架构图代码片段排障表检查清单

从固件到二进制:格式差异与逆向起点

指标对照卡:固件二进制结构解析

  • 关键对象:实际技术应用场景里的固件二进制结构解析
  • 问题现象:实际技术应用场景里固件二进制结构解析一开始改动很快,输入需求增加后日志记录显示状态外泄、循环依赖和接口膨胀。
  • 验证动作:先标出谁持有状态、谁发起调用、谁记录日志和失败返回,再按输入条件、阈值标准和处理动作决定接口是否需要拆分。第04节记录前后变化点时,优先确认示例片段、状态记录和固件二进制结构解析是否指向同一个原因。
  • 工程判断:调整前后调用方向更清楚,失败返回、日志记录和输出结果可追踪,旧入口仍可回退,才说明边界收住了。

固件二进制结构解析落地前要同时核对固件二进制结构解析的Bin格式互转、失败路径和段分析。

概念块:固件二进制结构解析

固件二进制结构解析用固件二进制结构解析、Bin格式互转、段分析连接到固件二进制结构解析的调试、验证和交付动作。

  • 固件二进制结构解析
  • Bin格式互转
  • 段分析
  • 掌握固件格式差异
固件二进制结构解析:ELF、Hex与Bin格式互转与段分析 · 系统架构图
flowchart TB N0["ELF"] N1["Hex"] N2["Bin"] N0 -->|指向| N1 N1 -->|指向| N2 classDef ns fill:#ecfeff,stroke:#0891b2,color:#164e63,stroke-width:1.6px; class N0,N1,N2 ns;

图表解读:对应正文“从固件到二进制:格式差异与逆向起点”。这张图以最终 Mermaid 图中的真实节点为准,先观察“固件二进制结构解析:ELF、Hex与Bin格式互转与段分析”的主链。读图顺序:ELF → Hex → Bin

节点说明:【固件二进制结构解析】表示可观察对象,标出该节点在主线中的位置;检查重点:相关操作、判断条件或常见问题。

在嵌入式固件逆向分析中,你拿到的第一个文件通常是 ELF(Executable and Linkable Format)、Hex(Intel HEX) 或 Bin(Raw Binary) 中的一种。对于 STM32H7 高性能 MCU 这类 Cortex-M7 内核芯片,固件通常以 ELF 作为开发阶段产物,Hex 用于烧录器,Bin 则是最终在 Flash 中执行的裸二进制镜像。不理解这三种格式的差异,后续的段分析、符号恢复和代码定位将无从下手

本节的核心意图是建立一条清晰的转换与验证链路:从 ELF 出发,通过 objdump 和 readelf 提取关键段,再按需转换为 Hex 或 Bin,最后验证转换结果是否与原始固件一致 最容易出错的步骤集中在地址偏移、段对齐和校验和计算上——这些细节正是本节要重点攻克的工程障碍

关键判断

逆向分析时,优先使用 ELF 格式,因为它保留了符号表和段信息;只有烧录或模拟执行时才需要 Hex 或 Bin。不要直接用 Bin 做段分析,否则会丢失所有符号和段边界

格式互转与段提取:objdump 与 readelf 实战

在 Ubuntu 或 WSL 环境下,objdump 和 readelf 是处理 ELF 文件的标准工具。对于 STM32H7 固件,你需要重点关注 .text(代码段)、.data(已初始化数据段)、.bss(未初始化数据段)以及 .isr_vector(中断向量表段)

使用 readelf 查看段表与符号

首先用 readelf -S firmware.elf 列出所有段,确认每个段的起始地址、大小和标志位。STM32H7 的 Flash 通常起始于 0x08000000,SRAM 起始于 0x24000000。接着用 readelf -s firmware.elf 导出符号表,定位关键函数如 Reset_Handler、main 或自定义中断服务函数

# 查看段表
readelf -S firmware.elf
# 查看符号表(含地址和大小)
readelf -s firmware.elf | grep -E "Reset_Handler|main|UART_IRQHandler"

这段命令属于“问题代码/原始配置”,核对参数、目标设备和返回信息,并用状态记录确认动作是否真正生效。

上述命令中,-S 输出段表,-s 输出符号表。通过 grep 过滤出目标符号,可以快速定位入口函数和关键中断服务例程的地址

使用 objdump 反汇编与段提取

objdump -d firmware.elf 可以反汇编整个固件,但更高效的做法是只反汇编特定段:objdump -d -j .text firmware.elf。对于 STM32H7 的 Thumb-2 指令集,反汇编结果中会显示每条指令的地址和机器码,这是逆向分析的主要输入

# 反汇编 .text 段
objdump -d -j .text firmware.elf > disassembly.txt
# 将 ELF 转换为 Bin(裸二进制)
arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
# 将 ELF 转换为 Intel Hex
arm-none-eabi-objcopy -O ihex firmware.elf firmware.hex

这段命令属于“推荐实现/重构后接口”,核对参数、目标设备和返回信息,并用状态记录确认动作是否真正生效。

这里使用 arm-none-eabi-objcopy 进行格式转换。-O binary 输出纯二进制镜像,-O ihex 输出 Intel Hex 格式。转换后务必检查文件大小:Bin 文件的大小应等于 Flash 中代码段的实际占用空间,而 Hex 文件因包含地址记录和校验行,体积会更大

实操步骤

转换完成后,用 hexdump -C firmware.bin | head -20 检查 Bin 文件头部是否与中断向量表一致(前 4 字节应为栈顶指针,接着 4 字节为复位向量地址)。这是验证转换正确性的最快方法

固件二进制结构解析的技术资产与验证方式

格式转换中最常见的错误是地址偏移和段缺失。下表总结了转换后的关键检查项,建议每次转换后逐条验证

固件二进制结构解析 相关检查
检查项标准是否通过常见遗漏
Bin 文件大小等于 .text + .data 段实际占用字节数(不…□ 是 □ 否未排除 .bss 段(.bss 不占用 Flash 空…
Hex 文件起始地址扩展线性地址记录(:02000004XXXX)中的地址…□ 是 □ 否地址写为 0x0000,导致烧录到错误位置
中断向量表首字Bin 文件前 4 字节(小端)等于栈顶地址,通常为…□ 是 □ 否未检查小端序,误将高字节当作低字节
符号地址一致性readelf 导出的 Reset_Handler 地…□ 是 □ 否忽略 Thumb 位(地址最低位应为 1)

真实项目场景

某次固件升级后,设备无法启动。通过 readelf 发现 .isr_vector 段被链接器放置到了 0x08001000(因开启了 Bootloader 分区),而烧录的 Hex 文件仍以 0x08000000 为基址。转换时未使用 --change-addresses 调整偏移,导致中断向量表错位。修正后,使用 objcopy --change-addresses=0x1000 重新生成 Hex,设备恢复正常

问题对照与修正

  1. 常见偏差:把固件二进制结构解析直接写进主流程,只验证能跑通,留下固件二进制结构解析边界、状态和验证口径不清。
  2. 修正做法:把固件二进制结构解析收敛成稳定接口,明确输入条件、状态结果和失败处理。
  3. 验证记录:选一个和固件二进制结构解析直接相关的失败场景,保留输入、日志、状态结果和状态记录前后变化,让修正是否有效能被复查。

异常信号与处理边界:段对齐与校验陷阱

在格式互转和段分析中,有三个常见风险点需要特别警惕:

常见误区

很多开发者认为 Hex 和 Bin 可以互相无损转换。实际上,Hex 包含地址映射信息,而 Bin 是纯数据流。从 Hex 转 Bin 时,如果 Hex 中有非连续地址段(如 Bootloader 和 App 之间有空洞),转换工具会填充 0xFF 或 0x00,导致 Bin 文件体积异常增大。务必使用 --gap-fill 参数控制填充值

掌握 ELF、Hex 与 Bin 的互转与段分析,是 STM32H7 固件逆向的第一步。后续会基于本节提取的段信息,深入分析中断向量表与启动流程,建立固件执行的完整时间线

细节补充:

固件二进制结构解析的细节补充应直接说明可复查对象:先确认现场任务对应的输入、输出和结果材料,再用固件二进制结构解析解释哪一处条件会影响判断。

固件二进制结构解析的主要风险来自固件二进制结构解析边界、状态和验证口径不清;落地前先核对示例片段,并确认例外场景和结果记录。

验收判断

本节的验收可以从失败表现倒推:当固件二进制结构解析不符合预期时,先区分是固件二进制结构解析没有建立,还是指标对照卡影响了输出。合格材料应能说明关键对象在什么条件下成立,并用Bin格式互转留下结果变化,而不是只写“已经完成”。继续实操前先保留一个最小复现入口,再根据实际技术应用场景里的固件二进制结构解判断问题属于输入、处理过程还是输出结果。保留一条最小证据线:固件二进制结构解析说明对象,命令核对说明约束,固件二进制结构解析说明状态,最后用Bin格式互转判断能否继续推进。第04节只保留一条主线:从固件二进制结构解析进入,观察现场判断,最后把Bin格式互转交给下一次复查。