固件逆向工程研讨会
此仓库包含 幻灯片 和动手实践材料,内容围绕 Emproof 在 ScapyCon Automotive 2025 上举办的固件逆向工程工作坊。该工作坊面向具有最少安全经验的技术受众,通过实用、自包含的任务教授基础知识。主题包括:
如果这也合你胃口,还可以查看 Emproof 技术网络研讨会系列,其中包含更多练习和录制课程。
工作坊内容由 Tim Blazytko 设计与组织,Simran Kathpalia 提供支持。
要设置环境,请克隆仓库:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
对于多个任务,我们需要一个 AArch64 Linux 执行环境。我们提供了一个基于 Kali Linux 的 Docker 容器,预装了常用工具(例如 GNU Binutils、Binwalk)。这简化了跨 Linux、Windows 和 macOS 的环境设置——无论宿主机 CPU 架构如何。启动容器并进入 shell 的命令如下:
./docker_run.sh
注意: 首次运行可能需要一段时间来构建镜像。
注意(架构): Docker Compose 服务设置了
platform: "linux/arm64"。
在 x86_64 宿主机(Intel macOS/Windows/Linux)上,Docker Desktop 将在仿真模式下运行镜像,因此首次构建和启动可能较慢——这是正常的。在原生的 ARM64 宿主机(Apple Silicon、ARM 服务器)上,它会原生运行,速度更快。
注意: Docker 容器也可以运行 ARMv7 (armhf) 二进制文件。我们在镜像中安装了 armhf 运行时(动态加载器 + 库),并通过启动脚本注册了
aarch64和arm的 binfmt 处理程序。
此外,请在宿主机上安装以下图形工具,用于交互式逆向工程任务(这些工具不包含在容器中):
这两个工具均可用于 Windows、Linux 和 macOS。
注意: Binary Ninja Free 不支持 AArch64。对于 AArch64 分析,请使用 Ghidra(或获得许可的 Binary Ninja 构建版)。因此,几个实验室提供了 ARMv7 配套 二进制文件(
*.armv7),专门用于 Binary Ninja Free;这些文件也可以在同一个容器中运行。
每个任务都包含在 tasks/<name>/ 中,并包括:
samples/ — 练习中使用的二进制文件(有时包含源码)task.md — 包含逐步指导与提示的任务说明任务可以独立尝试,但我们提供了一个推荐顺序(如下所列),该顺序逐渐增加难度并逐步引入新技术。大多数示例针对 ARMv7 (Thumb/ARM32) 或 AArch64;在相关之处,任务说明会标注架构、所需工具以及任何特殊的运行时需求。
tasks/hello_world:ELF 文件及元数据分析基础;Ghidra / Binary Ninja 入门。
tasks/license_check:提取硬编码密钥/解锁功能;基本补丁以绕过验证(破解)。
tasks/game:简单的猜数字游戏;理解逻辑并破解试用版与完整版模式。
tasks/keygenning_1:逆向许可证验证,编写最小密钥生成器以生成有效序列号。
tasks/keygenning_2:稍复杂的密钥生成任务(盐值/密钥、十六进制编码)。
tasks/string_encryption:包含加密字符串的二进制文件(常见于恶意软件);识别解密器并静态恢复字符串。
tasks/mirai:使用字符串解密例程的嵌入式恶意软件;浏览更大的代码库,识别有趣的结构,处理混淆字符串。
tasks/embedded_linux_1:带有文件系统的嵌入式 Linux 固件;解包、探索并破解 Linux 登录信息(CTF 风格)。
tasks/embedded_linux_2:类似,但查找并分析一个本不该存在的隐藏二进制文件。
tasks/car_demo:裸机固件分析:识别架构、开发板、内存映射、工具链工件;提取 Wi-Fi 凭据和协议端点。
tasks/iot_diag:诊断工具的裸机固件转储;根据数据手册重建内存布局,然后找到解锁诊断模式的密码。
tasks/crypto_detection:执行密码操作的 AArch64 二进制文件,使用硬编码 AES 密钥;定位 EVP 调用并回溯密钥/IV 以在不运行程序的情况下解密。
tasks/license_check_anti_patching:通过代码校验和进行反补丁;理解 CRC 守卫并学习绕过方法。
除非另有说明,本仓库中的所有工作坊材料均采用 GNU 通用公共许可证第2版 (GPL-2.0) 授权。完整文本请参见 LICENSE。
一些第三方/外部来源的示例被排除在 GPL 之外,仅用于分析/教育(禁止再分发)。这些文件是:
注意: 如果子目录包含自己的许可证文件或头部,则该子目录内容以对应的许可证为准。
tasks/fibonacci_obfuscation:干净版本 vs 混淆版本的斐波那契实现(switch 扁平化、计算 goto、不透明谓词、算术混淆、小型虚拟机);理解这些技术并将其归一化。