前言
固件分析,一种深入硬件底层(芯片级)的技术破解方法,经常被用于系统攻防对抗、硬件破解、逆向分析等实际工作中,相对其它技术破解攻击方法,科学有效的固件分析因其扒开了破解攻击对象的“外衣”,直接深入“骨髓”对其逻辑代码、数据存储、数据类别、数据属性等全方面分析,可找出其它攻击方法无法找出的严重漏洞,可对破解攻击对象形成“致命级杀伤力”。
固件分析,由“固件”和“分析”2个词组成,看似简单的4个字,要想有效充分发挥出其“杀伤力”,其背后人员需要庞大的技术体系支撑,这些技术体系并非孤立自成一体,而是环环相扣、相辅相成;每项技术体系、每个技术点都力求达到熟练甚至精通的标准。除此之外,还需要有超强的心理素质,在未知二进制“数据海洋”里“黑盒”探索,需要耐心、细心、信心,同时还要面对固件分析里的高失败率,因为很多时候即便你能获取到固件,由于固件本身的防护(如加密混淆)或固件分析实力不够等因素仍然无法找出有效漏洞,你可能会不知所措、迷茫无助甚至焦虑不安,你得到的仅仅是固件文件、一堆冰冷的二进制数据而已,除此之外毫无其他用处,这时还得及时调整心态和思路继续“战斗”,以上内容通俗的讲就是对固件分析技术人员要求很广的技术面、很深的技术点、很强的心里素质。
固件分析技术浅谈
上面已提到过,固件分析由“固件”+“分析”两部分组成,不了解固件,何谈分析?“固件分析”--固件之所以在前面想必原因也在此。考虑到篇幅原因,这里对固件只做概要说明,不深究。
什么是固件?
什么是固件(firmware)?怎么理解固件?不同的人有不同的回答,但每种回答都会反映出回答者理解固件分析的思维层次。
固件是什么?固件是软件的一种,也是一种程序。
固件是什么?固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序(百度百科)。
固件是什么?固件是指设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机等都有内部固件(百度百科)。
以上回答都没错,我个人的回答是:固件是存储在可由CPU直接或间接读取指令/数据并可运行的FLASH/ROM芯片里的二进制数据集合,这些指令/数据集合是根据CPU内核架构及型号,将高级编程语言(如C、C++等)由对应的编译器、链接器、装载器生成并通过对应的烧写器将指令/数据集合烧写到对应设备里的存储芯片中。固件之所以和软件程序区分开来,是为了强调固件侧重于智能设备、嵌入式设备、工控设备里运行的程序,而非PC电脑、服务器、手机内部的程序(只是侧重并非绝对,很多场合手机里的程序也被称为固件)。
固件的位置是存储在设备的FLASH/ROM芯片里,但展现在固件分析人员面前是提取出来后以文件的形式呈现。固件文件的格式并非固定不变,因厂家、设备不同而不同,目前常见的固件文件格式有:hex、bin、elf、axf、txt、ulmage等,对于固件分析人员,熟悉这些固件文件的内部编码规则、数据块定义等细节尤为重要,否则拿到固件你也不认识它,更无从分析它。
固件的由来--编译、链接、装载
对于固件,不仅知其然,知其所以然也很重要,虽说不同的固件,格式、编码不同,但其由来大体相同,都是由高级编程语言经编译、链接、装载生成而成,编译、链接、装载这3步6个字至关重要,是有效提升固件分析成功率的重点、难点,对固件文件的形成机制、固件文件内部函数构造、内部指令/RAM/数据分配机制、固件启动运行机制等核心概念的深入理解非常有益。然而也只有深入理解了这些固件相关知识,才能充分发挥固件分析的破解攻击价值。
固件运行机制
熟悉了什么是固件、固件的由来之后,在此,需要熟悉固件的运行机制。不同种类的设备,其内部固件运行的细节都不一样,但其运行机制大体类似,一般比较常见的运行机制是:上电boot->uboot->cos->applet,针对不带操作系统的运行机制一般是:上电-> boot-> applet或上电-> applet。这里仅作简要说明,实际固件分析过程中,最好是对每一步里每个函数、每行代码的功能都做到了如指掌,这样才能充分发挥固件分析的破解攻击价值。
固件分析其它必要技术
固件分析,离不开电路/器件分析,因此需要具备必要的数电、模电知识;典型固件分析里,牵涉到固件提取、IO控制查询、数字接口驱动、中断唤醒、工作模式切换、外围器件的驱动等方面,这些都离不开电路/器件分析。
固件分析,需要熟悉常用数据通信规约/协议簇(如TCP/IP协议簇、CAN总线),在你分析有关数据通信功能部分的固件时,熟练掌握各类常用数据通信协议和底层对应接口,会让你在固件分析时如虎添翼,得心应手。
固件分析,需要熟悉主流CPU/MCU处理器内部体系架构、内部各硬件模块工作原理(DMA、虚拟内存管理、中断处理、工作模式管理、外围模块等)、内部存储及运行机制等,还有熟悉/能看懂并理解主流CPU/MCU汇编语言(寄存器级别操作)也很重要,在分析固件时,对每个函数的初始化、数据处理、代码跳转、函数执行等方面会让你临危不乱、思路清晰。
固件分析,熟悉相关加解密算法及安全通信、认证机制架构/原理,会让你少走很多弯路,知道如何权衡利弊得失,避开暗坑,提升固件分析效率。
固件分析,学会使用对自己有用的相关工具(包括但不限于:IDAPro、binwalk等)会让你事半功倍,这些工具会快速提升你的工作效率,让你进入状态,花更多的时间精力在固件分析上,而不是在固件分析的准备路上。
固件分析,熟悉主流嵌入式操作系统工作原理及内核工作原理(如linux、android等)也至关重要,然而这个也是最难的,因为要深入了解操作系统内核的具体工作流程、任务调度机制、数据存储分配细节、权限管理、进程隔离保护/运行机制等非常难,非一朝一夕能学成,需要时间、需要毅力、更需要智商,但是一旦掌握了这些知识,在分析类似的固件时,则很容易找出漏洞,而且是高危漏洞。当然一旦达到此级别,个人认为已是大牛级别、黑客级别了。
编后语
随着信息安全的普及,固件分析不仅受到黑客爱好者们的青睐,厂家设计者也越来也重视固件的防护,这无疑会加大固件分析的难度和降低固件分析的成功率,也正是因为这矛与盾的竞争关系,促使着网络技术的不断进步,就看随的步伐块,步伐慢的人注定会有被攻击破解的风险。