论文部分内容阅读
嵌入式设备已经遍及生活生产的各个方面,所有这些设备都运行着固件,固件和传统软件一样通常有缺陷或者漏洞,使得设备存在安全威胁,甚至可能导致设备失效。逆向工程是对嵌入式设备固件进行安全性分析的常用方法,反汇编是整个逆向工程的基础和重要组成部分。对固件进行反汇编时,需要获得设备的处理器类型和固件装载基址,通过拆解设备或者查阅设备手册可以了解设备的处理器类型,但固件的装载基址却不容易确定。输入正确的固件装载基址才能使反汇编工具建立准确的代码交叉引用和数据交叉引用,这些交叉引用信息对于分析固件的行为、评估固件的安全性具有非常重要的意义。然而,大部分嵌入式系统的固件是非标准的、格式未知的二进制文件,据我们所知,目前尚不存在自动化工具或方法可以获得这类文件的装载基址。据统计当前大约有63%的嵌入式设备处理器是基于ARM架构的,因此本文以ARM体系结构下的嵌入式设备固件文件为研究对象,通过研究固件中二进制函数指令特点、函数入口表、字符串存储规律以及引用方式、文字池的存储规律等方面内容,本文提出了4种定位ARM设备固件装载基址的方法,主要贡献如下:(1)根据函数入口表和二进制函数序言的特点,提出了基于函数入口表的装载基址定位方法。首先,根据函数入口表的存储特点,提出了FIND-FET算法识别固件中所有可能的函数入口表。然后,分析了二进制函数序言的指令特点。最后,在此基础上提出了固件装载基址定位算法DBMFET,该算法根据函数入口表中的地址值确定装载基址的范围。如果某一个内存地址作为装载基址时,匹配的函数入口地址占函数入口表中所有地址的百分比大于预定阈值,将该内存地址作为候选装载基址,使用DBMFET算法处理固件所有的函数入口表。如果某个候选装载基址对应的函数入口表数目远远大于其他候选装载基址,则这个候选装载基址为正确的装载基址。(2)固件中通常引用一些字符串,根据字符串偏移量和字符串地址的对应关系,提出了基于字符串地址集合的装载基址定位方法。首先,根据固件中字符串的存储规律,提出了字符串识别算法FIND-String获取固件中所有字符串的偏移量和长度。然后,根据固件中字符串地址通常通过LDR指令加载,分别研究了ARM、Thumb状态下LDR指令的机器码格式,提出了FIND-LDR算法来识别固件中的LDR指令并计算出其加载的地址,FIND-LDR算法的输出结果经排序去重后得到地址集合。最后,提出了DBMSSA算法定位固件装载基址。该算法计算地址集合中每个地址与字符串偏移量集合中每个偏移量之间的差值,并统计每个差值出现的次数,若某个差值出现的次数远远大于其他差值,则该差值即为装载基址。(3)根据文字池中字符串地址的存储顺序与字符串在固件中的存储顺序通常是一致的这一特点,提出了基于文字池匹配的装载基址定位方法。首先,根据固件中存储字符串地址的文字池的存储规律,提出了FIND-LP算法识别固件中文字池。然后,提出了DBMLP算法定位装载基址,该算法以固件中的文字池和FIND-String算法获得的字符串偏移量和长度为输入,利用文字池中的字符串地址获得对应的字符串长度,将这些字符串长度依次匹配固件中所有的字符串长度,若匹配成功,则可以获得一个文字池中字符串地址与字符串偏移量的对应关系,据此可获得一个候选装载基址。对所有的文字池进行同样的操作,如果某个候选装载基址对应的文字池数目远远大于其他候选装载基址,该候选装载基址即为正确的装载基址。(4)利用相邻代码中引用的字符串集中存储的特点,提出了基于字符串存储长度分组匹配的装载基址定位方法。该方法首先利用字符串偏移量集合和字符串地址集合分别构造字符串存储长度向量,然后在第一个字符串存储长度向量中依次选取固定个数的分量作为一个分组;将分组顺序匹配第二个字符串存储长度向量,若匹配成功,则可获得字符串偏移量与字符串地址之间的对应关系,据此对应关系可计算出一个候选装载基址。对所有分组用同样的过程进行匹配,最后可以得到多个候选装载基址。如果某个候选装载基址出现的次数远远大于其他候选装载基址,则该候选装载基址即为正确的装载基址。对于上述4种方法,选取了16个固件文件作为测试集进行了实验,结果表明每种方法各有其适用范围。按成功率从高到低排序结果为第1、2、3、4种方法,依次为93.75%、87.5%、81.25%、68.75%;平均时间从短到长排序结果为第4、3、1、2种方法,依次为27.2秒、88.6秒、102.6秒、1181.6秒。