关于UEFI:UEFI/BIOS 固件分析
一、UEFI/BIOS 固件结构基础
BIOS 与 UEFI 的区别
项目 | BIOS | UEFI |
---|---|---|
启动模式 | 实模式,16位代码 | 保护模式,32/64位 |
文件格式 | 固定地址映射 | 模块化、文件系统支持 |
开发语言 | 汇编为主 | C语言为主 |
可扩展性 | 弱 | 强 |
安全机制 | 几乎没有 | Secure Boot、公钥验证、模块签名 |
当前大多数主板已全面采用 UEFI,BIOS 固件只是保留兼容层。
二、UEFI 固件文件结构详解
UEFI 固件(如 .rom
或 .bin
)一般包含以下几个主要部分:
+---------------------------------------------------+
| Flash Descriptor (管理区域划分) |
+---------------------------------------------------+
| ME Region(Intel管理引擎) |
+---------------------------------------------------+
| GbE Region(网络引导) |
+---------------------------------------------------+
| BIOS Region(固件主体,重点分析目标) |
+---------------------------------------------------+
我们做分析时,关注的主要是 BIOS Region,因为里面包含了:
-
PEI 阶段模块(Pre-EFI Initialization)
-
DXE 阶段模块(Driver Execution Environment)
-
UEFI 驱动和 App
-
NVRAM(存储 BootOrder、SecureBoot 等变量)
三、固件分析实战流程
【Step 1】提取固件镜像
-
一般格式:
.rom
、.bin
-
来源:
-
从厂商 BIOS 更新包中提取(如 Dell、HP、ThinkPad 等)
-
使用 SPI 编程器(CH341A)从主板 Flash 中读取
-
在已装系统上用软件如
UEFIExtract
、AFUWIN
、FPT
工具获取
-
【Step 2】使用 UEFITool 分析结构
-
工具地址:https://github.com/LongSoft/UEFITool
功能:
-
可视化浏览固件结构(Flash Layout)
-
提取 PE32 模块(DXE 驱动)
-
查看 NVRAM 变量(如 SecureBoot 状态)
-
修改后重新打包(用于制作 Bootkit)
示例:
-
打开固件镜像
-
展开
BIOS Region
,可以看到如:
├── Firmware Volume 1
│ ├── DXE Core
│ ├── Secure Boot Driver
│ ├── SATA Driver
│ ├── BootManager
│ └── ...
- 右键提取
.efi
/.pe32
驱动 → 用IDA加载分析
【Step 3】使用 IDA Pro 或 Ghidra 逆向 PE 模块
UEFI 驱动是标准 PE32/PE32+ 格式(和 Windows exe 一样)
-
入口点是
EFI_DRIVER_ENTRY_POINT
-
支持 C 函数调用,结构清晰
-
可查找特征函数:
-
InstallProtocolInterface
-
HandleProtocol
-
SetVariable
(用于设置 NVRAM 变量) -
StartImage
-
示例:逆向某 DXE 驱动,可能发现类似代码:
Status = gRT->SetVariable( // 调用 UEFI Runtime Services 的 SetVariable 函数,返回状态存储在 Status 中L"SecureBoot", // 变量名为 "SecureBoot",类型是 Unicode 字符串&gEfiGlobalVariableGuid, // 使用 EFI 全局变量的 GUID(全局唯一标识符),表示是标准的 UEFI 固件变量ATTRIBUTES, // 变量属性(如:EFI_VARIABLE_NON_VOLATILE、EFI_VARIABLE_BOOTSERVICE_ACCESS 等组合)sizeof(UINT8), // 数据大小是 1 字节(即一个 UINT8 类型)&SecureBootValue // 指向值的指针,这里传入的是 SecureBootValue 的地址
);
这表示该模块有能力开启或关闭 Secure Boot。
【Step 4】使用 Chipsec 检测系统固件安全性(动态分析)
-
工具地址:https://github.com/chipsec/chipsec
Chipsec 是一个强大的开源工具包,用于检查:
-
BIOS 写保护是否生效
-
SPI Flash 区域是否可被写入
-
Secure Boot 是否被禁用
-
是否存在已知 Bootkit 注入行为
示例命令:
sudo chipsec_main -m common.bios_wp
输出结果会显示 BIOS 是否处于写保护状态,如果未加锁就可能被攻击。
四、常见固件逆向目标
模块名称 | 功能 | 逆向价值 |
---|---|---|
DXE Core | 加载 DXE 阶段驱动 | 入口点,主线逻辑 |
Boot Manager | 启动系统 | 可被篡改为加载恶意引导器 |
Secure Boot 驱动 | 校验引导文件签名 | 绕过验证关键点 |
SetupUtility | BIOS 设置界面 | 修改设置项,如关闭 SecureBoot |
PlatformInit | 初始化硬件设备 | 持久化插桩点 |
五、逆向 Secure Boot 驱动模块简单解析
假设提取了某固件中的 SecureBoot DXE 驱动:
-
用 IDA 加载该 PE 模块
-
搜索关键字符串
SecureBoot
、db
、KEK
,找到使用点 -
查看变量设置位置是否调用
SetVariable
函数 -
检查是否存在逻辑缺陷,如未验证调用来源或权限
例如,早年某些平台 BIOS 中允许在 SMM(System Management Mode)中修改 SecureBoot 配置,而攻击者利用 Ring0 提权后可调用这些接口直接关闭 SecureBoot。
六、UEFI 固件重打包与修改
可以使用工具:
-
UEFITool + IFR Extractor 修改 SetupUtility 中隐藏设置
-
UEFIReplace / UEFIPatch 替换驱动模块实现 Bootkit
-
IFDTool 修改 Flash Descriptor 区域重新划分权限
-
MEAnalyzer 分析 ME 区域是否存在风险点
一旦修改固件不当,会导致主板变砖,强烈建议先在虚拟平台(如 QEMU + OVMF)测试。
七、总结
UEFI 是开机链的第一个执行点,它:
-
掌控着系统是否能启动
-
决定是否开启安全机制(SecureBoot、TPM等)
-
允许加载第三方驱动(DXE/App)
正因为它是“第一执行点 + 最高权限 + 最难检测”,所以被高级攻击组织(APT)作为隐蔽后门的首选目标。掌握固件分析能力,等于打开了通向真正高阶逆向的大门。