QEMU 8.2 + Chroot 解密实战:从固件中提取并运行解密程序的5个步骤

📅 2026/7/11 8:00:24
QEMU 8.2 + Chroot 解密实战:从固件中提取并运行解密程序的5个步骤
QEMU 8.2与Chroot深度实战固件解密程序提取与运行全流程解析1. 固件解密技术背景与实战价值在嵌入式设备安全研究领域获取未加密的固件文件系统是进行漏洞挖掘和逆向分析的基础前提。然而随着设备厂商安全意识的提升越来越多的新版固件采用了加密措施。据统计2023年发布的物联网设备中采用加密固件的比例已达到67%较前一年增长23%。面对这一趋势安全研究人员需要掌握从历史版本固件中提取解密程序的核心技术。传统固件解密方法主要分为三类硬件提取通过JTAG/UART接口直接读取存储芯片网络拦截捕获设备OTA升级过程中的传输数据加密逆向分析固件加密算法并编写解密脚本而本方案采用的固件内解密程序提取方法具有以下独特优势可靠性高直接使用设备厂商开发的解密工具避免算法逆向误差通用性强同一厂商不同型号设备往往使用相同解密逻辑效率突出省去复杂的加密算法分析过程以D-Link DIR-882路由器为例其固件版本迭代过程呈现典型的三阶段特征v1.00B07 (未加密) → v1.04B02 (含解密程序) → v1.30B05 (加密版本)通过分析中间过渡版本我们可以获取完整的解密工具链。2. 环境准备与工具链配置2.1 基础环境要求进行本实验需要准备以下环境宿主系统Ubuntu 22.04 LTS内核版本5.15处理器架构x86_64需支持硬件虚拟化内存容量至少8GB处理大型固件时建议16GB存储空间50GB可用空间用于存放固件和文件系统关键工具版本要求# 验证工具版本 qemu-system-x86_64 --version # 需 ≥ 8.2 binwalk -v # 需 ≥ 2.3.3 chroot --version # 需 ≥ 2.342.2 QEMU静态编译与配置为运行不同架构的解密程序需要编译安装多架构QEMU静态版本# 安装依赖 sudo apt install build-essential git libglib2.0-dev libfdt-dev \ libpixman-1-dev zlib1g-dev ninja-build # 下载源码 git clone https://gitlab.com/qemu-project/qemu.git cd qemu git checkout v8.2.0 # 编译静态版本 ./configure --static --enable-system --target-listarm-linux-user,aarch64-linux-user,mips-linux-user,mipsel-linux-user make -j$(nproc)编译完成后关键二进制文件位于./build/arm-linux-user/qemu-arm./build/aarch64-linux-user/qemu-aarch64./build/mips-linux-user/qemu-mips2.3 目标固件获取与预处理从厂商官网下载不同版本的固件文件wget http://firmware.dlink.com/DIR882A1_FW104B02_Middle_FW_Unencrypt.bin wget http://firmware.dlink.com/DIR882A1_FW110B02.bin wget http://firmware.dlink.com/DIR882A1_FW130B05.bin使用binwalk进行初步分析binwalk DIR882A1_FW104B02_Middle_FW_Unencrypt.bin # 输出示例 DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 uImage header, header size: 64 bytes... 1024 0x400 LZMA compressed data... 1048576 0x100000 Squashfs filesystem...3. 文件系统提取与解密程序定位3.1 完整文件系统提取使用binwalk递归提取固件内容binwalk -Me DIR882A1_FW104B02_Middle_FW_Unencrypt.bin提取完成后文件系统通常位于_xxxx.extracted目录下。典型的路由器文件系统结构如下/squashfs-root/ ├── bin ├── etc ├── lib ├── sbin ├── usr └── var3.2 解密程序识别技巧在文件系统中定位解密程序的方法关键词搜索法grep -r decrypt ./squashfs-root 2/dev/null特征文件检查/bin/目录下的可疑二进制文件/usr/sbin/中的设备管理程序固件更新相关脚本通常包含fwupdate、upgrade等关键词功能验证法 对候选程序进行运行测试观察是否产生解密行为在DIR-882案例中我们定位到关键解密程序/squashfs-root/bin/imgdecrypt3.3 程序依赖项分析使用ldd命令检查动态链接库依赖ldd ./squashfs-root/bin/imgdecrypt典型输出示例not a dynamic executable或libcrypto.so.1.1 not found libssl.so.1.1 not found对于缺失的库文件需要从目标文件系统的/lib目录复制到宿主机的对应位置。4. QEMU-Chroot跨架构执行方案4.1 静态编译QEMU部署将编译好的QEMU静态二进制文件复制到目标文件系统cp qemu-mipsel ./squashfs-root/usr/bin/ chmod x ./squashfs-root/usr/bin/qemu-mipsel4.2 Chroot环境配置创建必要的设备节点和挂载点sudo mknod -m 666 ./squashfs-root/dev/null c 1 3 sudo mknod -m 666 ./squashfs-root/dev/random c 1 8 sudo mount -o bind /proc ./squashfs-root/proc4.3 跨架构执行解密程序使用chroot结合QEMU静态解释器运行目标程序# 设置环境变量 export QEMU_LD_PREFIX./squashfs-root # 执行解密测试 sudo chroot ./squashfs-root /usr/bin/qemu-mipsel /bin/imgdecrypt --test成功运行的典型输出特征Image decrypt tool v1.2 Valid encryption header found Test decryption successful5. 完整解密流程与自动化脚本5.1 手动解密步骤准备待解密固件cp DIR882A1_FW130B05.bin ./squashfs-root/tmp/在chroot环境中执行解密sudo chroot ./squashfs-root /usr/bin/qemu-mipsel /bin/imgdecrypt \ /tmp/DIR882A1_FW130B05.bin /tmp/decrypted.bin验证解密结果binwalk /tmp/decrypted.bin5.2 自动化解密脚本创建decrypt_firmware.sh自动化脚本#!/bin/bash # 参数检查 if [ $# -ne 2 ]; then echo Usage: $0 encrypted_firmware output_file exit 1 fi # 准备环境 FIRMWARE$1 OUTPUT$2 FS_ROOT./squashfs-root QEMU_BIN$FS_ROOT/usr/bin/qemu-mipsel DECRYPT_TOOL$FS_ROOT/bin/imgdecrypt # 复制固件到chroot环境 cp $FIRMWARE $FS_ROOT/tmp/input.bin # 执行解密 sudo chroot $FS_ROOT $QEMU_BIN $DECRYPT_TOOL \ /tmp/input.bin /tmp/output.bin # 提取解密结果 cp $FS_ROOT/tmp/output.bin $OUTPUT # 清理临时文件 rm $FS_ROOT/tmp/input.bin $FS_ROOT/tmp/output.bin echo [] Firmware decrypted to: $OUTPUT5.3 批量处理与验证对于多版本固件解密可使用如下批量处理命令for fw in encrypted/*.bin; do ./decrypt_firmware.sh $fw decrypted/$(basename $fw) if ! binwalk decrypted/$(basename $fw) | grep -q Squashfs; then echo [-] Decryption failed for $fw fi done6. 技术难点与解决方案6.1 常见执行错误处理问题1动态链接库缺失/bin/imgdecrypt: line 1: syntax error: unexpected word (expecting ))解决方案# 检查文件类型 file ./squashfs-root/bin/imgdecrypt # 若为动态链接可执行文件复制依赖库 cp -n ./squashfs-root/lib/*.so* /lib/x86_64-linux-gnu/问题2架构不匹配qemu: uncaught target signal 11 (Segmentation fault) - core dumped解决方案确认目标架构使用file命令使用对应架构的QEMU解释器添加-strace参数调试系统调用6.2 性能优化技巧使用预加载减少QEMU开销export QEMU_LD_PREFIX$(pwd)/squashfs-root sudo chroot ./squashfs-root /bin/sh -c LD_PRELOAD/lib/libcrypto.so.1.1 /usr/bin/qemu-mipsel /bin/imgdecrypt内存磁盘加速# 将文件系统加载到tmpfs sudo mount -t tmpfs -o size512M tmpfs ./squashfs-root/tmp并行解密处理parallel -j 4 ./decrypt_firmware.sh {} decrypted/{/} ::: encrypted/*.bin7. 安全研究与拓展应用7.1 漏洞挖掘工作流成功解密固件后典型的安全研究流程文件系统分析查找硬编码凭证grep -ri password ./squashfs-root检查SUID程序find ./squashfs-root -perm -4000服务审计分析/etc/init.d/启动脚本检查开放端口与服务对应关系Web应用测试提取Web文件cp -r ./squashfs-root/usr/www ./使用lighttpd本地搭建测试环境7.2 网络靶场集成将解密技术应用于网络靶场建设的建议方案固件仓库构建按厂商/型号/版本分类存储加密固件建立自动化解密任务队列仿真环境配置# Dockerfile示例 FROM firmadyne/firmadyne # 添加解密工具 COPY qemu-mipsel /usr/bin/ COPY squashfs-root /firmadyne/ # 设置启动脚本 CMD [/firmadyne/run.sh]自动化扫描集成在CI/CD流程中加入固件解密步骤与漏洞扫描工具如BinAbsInspector联动8. 法律合规与伦理考量在进行固件解密研究时必须注意以下法律边界授权范围仅测试自己拥有所有权的设备企业研究需获得厂商书面授权数据保护匿名化处理固件中的用户数据加密存储包含敏感信息的分析结果漏洞披露遵循90天披露原则通过CVE等平台规范报告流程典型的研究合规检查清单[ ] 获得测试设备所有权证明[ ] 签署保密协议如涉及第三方固件[ ] 建立数据擦除流程[ ] 准备漏洞披露模板在实际项目中我们曾遇到DIR-882解密程序对DIR-878固件的兼容性问题。通过分析发现虽然两个型号使用相同的加密头结构但878固件在尾部添加了额外的校验字段。修改解密程序的输出缓冲区大小后成功解决这印证了同厂商设备间的加密方案相似性。