固件是什么
固件(Firmware)是一种特殊的软件程序,它被永久或半永久地存储在硬件设备的只读存储器(ROM)、闪存(Flash Memory)或其他非易失性存储器中。固件处于硬件和软件之间的特殊位置,为硬件设备提供底层控制和基本功能。
固件在于我们日常生活中也是非常常见,比如:
- 电脑主板的BIOS/UEFI固件:是电脑启动时运行的第一个程序,负责检测并初始化硬件,然后引导操作系统。
- 家用路由器固件:它控制着WiFi信号的发射、网络数据包的转发、IP地址分配(DHCP)、端口映射、防火墙规则等核心功能。
- 汽车发动机控制单元(ECU)固件:通过传感器收集数据,精确控制燃油喷射、点火时机等,直接影响发动机的性能和效率。
本文将通过一个CTF固件题目来走通一个固件逆向的流程。
固件逆向的基本流程
获取固件
- 从官网直接下载固件:只是最简单的方式,有些设备官网是直接提供固件用用户更新。
- 从设备中提取:这种方式比较难,需要用于一定的硬件知识,通过设备上的UART、JTAG、SWD等调试接口,通过命令或工具导出固件。如果Flash是独立的可以直接尝试从外部连接Flash进行提取。
- 远程提取:如果设备支持远程链接,可以通过Telnet或者ssh从目标设备中获取固件。
初步分析固件包
固件通常是多个文件打包出来的bin、zip、LZMA等文件压缩包。其中,最常见的为bin和zip格式。
我们需要先确定固件包的类型才能进行下一步解包。
解包与提取
bin: 二进制镜像形式,使用binwalk进行识别与提取。
zip: zip压缩包,使用unzip命令解包。
LZMA:LZMA压缩包,使用unlzma命令解包。
核心分析
针对提取出来的核心二进制文件或脚本进行逆向分析或漏洞分析。
二进制文件架构通常是ARM、MIPS、PowerPC、x86等。
CTF固件题
题目
网管小张审计日志时发现疑似黑客使用Bash漏洞对公司的路由器进行了攻击,小张通过技术手段获取到了路由器固件dump文件,但是小张不懂逆向分析,请帮助小张分析出后门程序所使用的远程服务器和端口.
目标:获取后门程序所使用的远程服务器和端口.
环境/工具
- kali 虚拟机
- ghidra
分析过程
找到逆向程序
题目文件是bin文件格式,所以可以使用binwalk -e 51475f91-7b90-41dd-81a3-8b82df4f29d0.bin命令会自动解压出已经识别的压缩数据。
binwalk会自动解压出来squashfs文件系统, 日志文件通常位于/var/log或/tmp,我们可以在/tmp/backdoor位置找到一个elf文件, 通过file backdoor命令验证。
逆向程序
使用ghidra进行逆向分析,发现这并没有常规的代码,通过搜索程序中的字符串发现,这个程序使用upx 3.08进行压缩过。

直接使用upx -d ./backdoor命令进行解压缩,得到原始程序,重新使用ghidra进行分析。
首先找到用于socket连接的函数connect,通过交叉引用得到哪些地方调用了connect去网络链接。

通过符号信息connectTimeout作者封装了一个函数用于处理带超时的connect函数,继续交叉引用。

实际上远程服务器的代码在initConnection函数中,通过ghidra的伪代码其实是可以直接看出来代码逻辑。

initConnection函数一个参数是socket句柄,第二个参数是服务器网址,第三个参数是端口号,第四个函数是超时时间。
所以最终得到黑客的远程服务器和端口是 echo.byethost51.com:36667。
固件安全
固件代码的安全性非常重要,尤其在涉及通讯加密等核心算法时。为了防止被逆向分析,我们通常希望借助代码混淆、虚拟化等保护技术。然而,固件与一般软件不同,其运行环境往往是定制化的系统,因此常规加壳工具通常无法兼容。
VirboxProtector 的优势在于,它支持对静态库和目标文件进行代码保护。通过固件工具链最终链接生成的程序仍能在目标环境下正常运行,从而确保保护后的代码既安全又可执行。
代码虚拟化技术通过将固件中的关键函数转换为自定义虚拟机字节码,实现对逻辑的深度隐藏。原始指令被替换为仅能在特定虚拟机中解析的指令序列,逆向分析者看到的将不再是熟悉的汇编代码,而是一套全新的指令体系。攻击者无法直接定位诸如设备初始化、密钥生成或通信加密算法等核心逻辑,必须先完整分析虚拟机架构,这一过程的复杂度远超传统逆向分析。即便在内存中找到了某些通信参数或密钥片段,也难以追踪其在系统内部的真实生成与传递路径。
代码混淆技术则通过控制流平坦化、虚假分支插入与指令替换等手段彻底打乱代码的逻辑结构。原本清晰的通信加密算法被展开为复杂的跳转与调用网络,密钥派生过程被拆分并掩藏在多层逻辑之下。最终的加密密钥可能分布于多个变量中,经过多次运算和条件变换后才被动态组合生成。对于攻击者而言,即使掌握了通信函数的调用点,也难以直接提取出真实密钥或还原算法逻辑,从而显著提升了固件的代码安全强度。