掌桥专利:专业的专利平台
掌桥专利
首页

ARM和MIPS架构固件的加载基地址定位方法、设备及介质

文献发布时间:2024-04-18 19:52:40



技术领域

本文件涉及固件加载基址定位技术领域,尤其涉及一种ARM和MIPS架构固件的加载基地址定位方法、设备及介质。

背景技术

由于物联网设备的规模和数量的增长,物联网安全也成为了一个重要的问题。物联网设备的安全问题主要由以下几个方面造成:

1.由于物联网设备通常是嵌入式系统,因此其硬件设计和制造存在一些固有的限制,这些限制会影响设备的安全性。

2.很多普通用户在使用物联网设备时缺乏安全意识,比如使用弱密码、不及时更新设备软件等,这给攻击者留下了可乘之机。

3.物联网设备中的软件可能存在漏洞,攻击者可以利用这些漏洞进行攻击。由于物联网设备通常使用的是嵌入式系统,开发过程中常常缺乏安全性考虑,因此漏洞的出现比较常见。其中以物联网设备的软件漏洞最为突出,因为这些漏洞通常能够导致远程的命令执行,攻击者可以完全控制目标设备。分析确定RTOS固件的加载地址是对物联网设备进行安全分析的大前提。现有方法中的寻找函数入口表并基于函数入口表的绝对地址来猜测加载基地址的方法,不能适用于所有版本的ARM架构且无法用于MIPS架构。

发明内容

本发明提供了一种ARM和MIPS架构固件的加载基地址定位方法、设备及介质,旨在解决上述问题。

本发明实施例提供了一种ARM和MIPS架构固件的加载基地址定位方法,包括:

S1、通过正则表达式在整个固件中进行匹配,得到所有可见字符串的信息S;

S2、对S中得到的字符串信息使用语义分析进行二次筛选,得到语义正常可分词的字符串信息,记录字符串在固件中的偏移量,记为S’,字符串数量记为SN;

S3、以预设长度的字节数据为一个指针,遍历并记录下所有的指针记为P,记录指针的数量记为PN,统计指针的频次,按照频次的升序进行排序获取P

S4、获取字符串偏移量数组的差异数组PD;

S5、根据字符串在固件中的偏移量以及差异数组PD获取可能的加载基址;

S6、验证可能加载地址的正确性;

S7、重复S5和S6,得到所有可能的加载基地址以及匹配成功次数,最后得到可能的加载基地址次数表,匹配次数越多则该地址是正确的加载基地址的可能性越大。

本发明实施例还提供了一种电子设备,包括:

处理器;以及,

被安排成存储计算机可执行指令的存储器,所述计算机可执行指令在被执行时使所述处理器执行如上述ARM和MIPS架构固件的加载基地址定位方法的步骤。

本发明实施例还提供了一种存储介质,用于存储计算机可执行指令,所述计算机可执行指令在被执行时实现如上述ARM和MIPS架构固件的加载基地址定位方法的步骤。

通过采用本发明实施例不需要人工分析固件,大量节省安全研究员的时间和精力。快速确定固件加载基地址,现有的技术或者工具都需要对固件进行长时间分析,又或者需要拆卸设备进行调试,本方法可以在极短时间内得到高准确度的固件加载基地址,推进安全研究的进展。本方法可以指定匹配的各种参数,对于大型固件和小型固件可以分别指定不同的参数以获得最好的匹配效果。本方法不仅仅对于RTOS类型的固件适用,对于Linux系统的程序也适用。本方法会按照可能性降序给出数个可能的加载基地址,如果某个基地址不正确可以马上尝试其他可能的加载基地址而不用再进行额外的分析。本方法适用于ARM和MIPS架构,而非单一架构,并且在分析不同架构的固件时无需做任何修改,具有强大的通用性。

附图说明

为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例的ARM和MIPS架构固件的加载基地址定位方法的的流程图;

图2为本发明实施例的一种RM和MIPS架构固件的加载基地址定位方法的具体实现的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本文件的保护范围。

物联网设备的操作系统分为两大类:Linux和RTOS。其中对于Linux操作系统的设备的固件分析和通常的软件分析类似,可以直接用binwalk对固件进行解包然后用IDA或者Ghidra分析其中的各个程序;然而对于RTOS固件的分析要困难许多,因为RTOS类型的固件无法进行解包,它以一个大的二进制文件的形式呈现,对于每一个二进制文件的分析,IDA或者其他反编译工具都需要确定二进制文件的加载地址之后才能完整分析,对于Linux系统的固件,使用的是ELF格式的文件,ELF文件之中存储着文件在内存中的加载地址,故IDA在对其分析的时候无需我们手动设置加载地址;而对于RTOS这样的大型二进制文件,其中并不会存储加载地址的信息,在使用IDA对其分析时需要先我们先分析确定好RTOS固件的加载地址才能正确分析,因此分析确定RTOS固件的加载地址是对物联网设备进行安全分析的大前提。

对于ARM架构的固件的加载地址的分析,前面已经有许多人提出了不少方法。朱等人在《ARM设备固件装载基址定位的研究》中提出了一种方法,其基本思路如下:在ARM固件中存在很多函数入口表,函数入口表中会存放许多函数在内存中的加载地址。在ARM架构下,arm模式下函数序言(也就是函数开头的几条汇编指令)通常会是STMFD,thumb模式下的函数序言通常为PUSH,因为函数开头需要保存上一个函数的上下文数据。而由于在函数入口表中存放的是函数的绝对地址,那么如果我们对固件的加载基地址设置错误,那么跳转到函数开头后,函数开头肯定不会是正确的函数序言。那么反过来想,可以先假定一个加载地址,如果跳转到函数开头处正好是函数序言,就可以认为这个加载地址是正确的。

朱还提出了另一种固件加载地址的确定方法,在ARM架构中存在一类LDR指令,该指令的格式为LDR RX,=0xaddr,第二个参数为一个立即数,而ARM架构中对于字符串的加载一般使用LDR指令,其第二个操作数通常是字符串的绝对加载地址,因此思路就是提取固件中所有LDR指令,以及所有字符串在固件中的偏移量,使用LDR指令中的立即数减去字符串在固件中的偏移量就能得到一个基地址集合。

除了函数入口表,还可以根据芯片的技术手册来尝试确定代码的加载地址,拿到设备之后,根据芯片的丝印找到其对应的datasheet,在datasheet中会记录芯片的内存映射图,根据代码段、数据段、外设映射等等都会在这个映射图中给出,因此可以根据映射图来确定固件的加载地址。还可以根据设备的串口调试信息来获取固件的加载地址,串口是留在设备的电路板中的一个调试接口,在开发阶段需要对设备进行调试,接入到电路板上的串口中再在电脑中打开终端调试助手就能够查看到设备输出的各种信息,比如启动信息、初始化信息等等,在这些信息中可能就包含了我们需要的加载地址;还可以使用魔数定位法,什么叫做魔数?即一些特殊的特征数,如ELF文件开头会有ELF三个字符。嵌入式设备上电启动时最先运行的会是bootloader的代码,而现在很多厂商使用的bootloader是一个叫做uboot的开源项目,在uboot中存在一个魔数,其值为0x27051956,这个值在多处被引用,然后在uboot的固件中寻找这个魔数,找到这个魔数的引用地址,再根据引用地址和在固件中的偏移地址相减就能够得到加载基地址。

朱的论文中提出的方法基于函数入口表以及函数序言来确定固件加载基地址,然而这种方法具有局限性,ARM架构有很多版本,并不是所有版本的ARM架构芯片都存在类似的函数入口表,而且此方法仅使用于ARM架构,对于MIPS架构的固件无法使用。朱瑞瑾博士提出的另一种通过LDR指令查找固件加载地址的方法存在如下问题,首先ARM用于传参的寄存器一共有4个,R0-R3,我们无法确定哪个是用于传递字符串地址的,而且也无法确定LDRRX,0xxxxx所传递的立即数是否为字符串地址,因此需要对每一个LDR指令和所有的字符串偏移量进行计算,这样将产生不小的开销,且R0-R3用于传参则是用于ARM架构的固件,在MIPS架构下则是不同的指令和不同的寄存器用于传参,因此使用LDR指令定位法定位固件加载基地址会有开销较大和不够通用的问题。而通过查找芯片的技术手册来确认加载地址也是不够准确的,比如芯片手册只是提供一个加载地址的设定范围,真正的加载地址是多少由各个厂商自己设定,而且有些设备的芯片是定制的,其数据手册是保密的不会公开;通过设备的串口输出信息基地址定位存在如下缺点,现阶段厂商的安全意识有所增强,其设备出场之后可能会禁用串口的使用,这样一来串口将不会输出任何数据,这样一来使用串口定位加载地址就会无效。魔数定位法也有较大的局限性,uboot虽然使用广泛,但也有不少厂商使用的是自研的bootloader,而且即使厂商使用了uboot,但也基本不会使用原生的uboot,厂商会在原版本的uboot之上进行修改,uboot的魔数也很可能被修改为厂商自定义的魔数。总的来说,现有的固件加载地址确定方法都有较大的局限性,单一架构、适用范围较小、存在偶然性等等。本发明主要解决了当前RTOS固件或者裸机程序加载地址难以确定以及确定起来困难耗时长的问题。对于RTOS或者裸机固件,如果无法确定加载基地址,那么使用IDA等反编译工具载入固件之后将无法看到正确的分析结果,因为固件之中的函数交叉引用以及字符串交叉引用等都依赖于加载基地址,因此对于RTOS/裸机的固件分析,加载基地址的确定尤为重要。确定加载基地址通常需要安全研究员做大量的尝试和试错,这将消耗大量时间和精力,本发明能够将加载地址的确定自动化,快速化,准确化,并且当前用于确定RTOS/裸机固件加载地址的方法往往具有架构局限性,要么适用于ARM架构,要么适用于MIPS架构,并不能同时对于两种架构进行分析,而本发明则是能够对ARM/MIPS架构的固件通用。

方法实施例

根据本发明实施例,提供了一种RM和MIPS架构固件的加载基地址定位方法,图1为本发明实施例的RM和MIPS架构固件的加载基地址定位方法的流程图,根据图1所示,本发明实施例的RM和MIPS架构固件的加载基地址定位方法具体包括:

S1、通过正则表达式在整个固件中进行匹配,得到所有可见字符串的信息S;

S2、对S中得到的字符串信息使用语义分析进行二次筛选,得到语义正常可分词的字符串信息,记录字符串在固件中的偏移量,记为S’,字符串数量记为SN;

S3、以预设长度的字节数据为一个指针,遍历并记录下所有的指针记为P,记录指针的数量记为PN,统计指针的频次,按照频次的升序进行排序获取P

S4、获取字符串偏移量数组的差异数组PD;

S5、根据字符串在固件中的偏移量以及差异数组PD获取可能的加载基址;

S6、验证可能加载地址的正确性;

S7、重复S5和S6,得到所有可能的加载基地址以及匹配成功次数,最后得到可能的加载基地址次数表,匹配次数越多则该地址是正确的加载基地址的可能性越大。

图2为本发明实施例的一种RM和MIPS架构固件的加载基地址定位方法的具体实现,包括:

S11:通过正则表达式在整个固件中进行匹配,得到所有可见字符串的信息S。

S12:对S中得到的字符串信息使用语义分析进行二次筛选,得到语义正常可分词的字符串信息,将这些字符串在固件中的偏移量进行记录,这个偏移量数组记为S’,并且记录下来字符串的数量,记为SN。

S13:32位ARM架构下指针长度为4字节,遍历整个固件,将固件的每4个字节的数据都看作是一个指针(地址),记录下所有的指针,记为P,以及指针的数量,记为PN。

S14:对P中的指针进行二次筛选,排除掉无效指针,如0xffffxxxx这样的值,并且统计指针频次,然后对P按照升序进行排序得到P’。

S15:获取字符串偏移量数组的差异数组。对S’中相邻的所有值两两相减得到一个新的数组SD,即由S’(1)-S’(0)=SD(0),依此类推。按照同样的方式由P’数组得到PD数组.

S16:对于DS中的每一个值,在PD中尝试进行匹配,匹配的长度可变并且由用户指定,如果匹配成功则说明两个字符串在固件中的偏移量能够和两个指针之间的差值对应上,由于字符串在固件中的引用可能是以立即数方式进行加载,所以将匹配到的指针减去相应的字符串在固件中的偏移量就能够得到一个可能的加载基地址。

S17:得到可能的加载基地址之后,需要验证这个加载基地址是否正确。由于字符串在固件中的引用可能是以立即数方式进行加载,这个立即数是由加载基地址加上字符串在固件中的偏移得到的,由此原理,我们将S14中得到的可能的加载基地址加上S’中的每一个值,然后在P’中进行匹配,并且记录匹配成功的次数。

S18:重复S16和S17,得到所有可能的加载基地址以及匹配成功次数,最后得到可能的加载基地址次数表,匹配次数越多则该地址是正确的加载基地址的可能性越大。

S19:为了加快分析速度,采用多线程来加快处理速度,并且使用C语言编写,确保底层执行速度足够快。

现有技术中采用寻找函数入口表并基于函数入口表的绝对地址来猜测加载基地址的方法,这种方法不能适用于所有版本的ARM架构且无法用于MIPS架构;朱瑞瑾博士的论文中提到的LDR指令定位方法则存在较大的时间开销,需要对所有LDR指令进行测试,并且依然受限于ARM指令集架构,对于MIPS架构无能为力;查找芯片的datasheet则可能存在datasheet缺失以及厂商自定义的情况;从串口中获取加载地址信息则需要拆卸设备并且串口可能被封禁;采用魔数定位法也存在着相当大的特殊情况。

基于以上缺陷,并且基于ARM和MIPS架构都是定长指令集架构(即ARM和MIPS架构的指令长度都是4字节长度)的前提条件,再加上固件中通常存在大量字符串信息的现有情况,提出了基于指针差异匹配定位固件加载基地址的方法,此方法不再根据函数入口表来确认加载地址,不再需要根据LDR指令来获取字符串指针,也无需查找datasheet以及拆解设备,依托于固件中大量存在的字符串信息来定位加载地址,这一点和LDR指令定位法类似,但区别在于:LDR指令定位法需要查找固件中所有的LDR指令并从中提取立即数,而本方法无需查找任何指令,也就是说无需根据特定指令来获取字符串加载地址,没有了指令的限制,本方法即可应用于ARM和MIPS架构。在固件中有这样一条公式:字符串在内存中的加载地址SA-字符串在固件中的偏移SO=固件在内存中的加载基地址BA(SA-SO=BA),这是一个通识。我们先使用正则匹配提取出固件中所有的字符串信息,然后对于这些字符串信息进行二次筛选,筛选方法是使用基于机器学习和特征提取的自然语言识别技术对所有的字符串信息进行筛选,筛选标准为字符串可分词语义正常,这样能够排除掉大量无效字符串,将字符串信息按照其在固件中出现的偏移量升序排列,构成一个字符串偏移量集合S。由于ARM和MIPS架构下所有指令定长,指针长度均为4字节,所以我们将整个固件的所有数据看作为4字节指针的集合,然后统计整个指针中指针开头数据的出现频次,再排除掉基本不可能为加载地址开头的指针,对所有的指针数据进行一个大的筛选并按照升序排列得到一个指针集合P。随后对字符串偏移量集合S两两求差值得到一个偏移量差异集合SD,再对指针集合P两两求差值得到指针差异集合PD。假设P中所有值都是字符串在内存中的加载地址,我们将SD中的所有值按照一定的步长在PD中进行匹配,如果匹配成功,则说明在固件中存在两个字符串,其在固件中的偏移和两个指针的差值相同,即这两个字符串正好和这两个指针能够对应成功,再根据公式SA-SO=BA,我们将相应的指针减去字符串在固件中的偏移量,得到一个可能的加载基地址;后续继续重复这些操作,直到SD中的所有值都完成了这些操作,这样一来就能够得到许多可能的加载基地址,将这些可能的加载基地址按照出现次数进行一个排序,出现次数越多则说明这个地址是加载基地址的可能性越大。

通过采用本发明实施例,具备如下有益效果:

1、不需要人工分析固件,大量节省安全研究员的时间和精力。

2、快速确定固件加载基地址,现有的技术或者工具都需要对固件进行长时间分析,又或者需要拆卸设备进行调试,本方法可以在极短时间内得到高准确度的固件加载基地址,推进安全研究的进展。

3、本方法可以指定匹配的各种参数,对于大型固件和小型固件可以分别指定不同的参数以获得最好的匹配效果。

4、本方法不仅仅对于RTOS类型的固件适用,对于Linux系统的程序也适用。

5、本方法会按照可能性降序给出数个可能的加载基地址,如果某个基地址不正确可以马上尝试其他可能的加载基地址而不用再进行额外的分析。

6、本方法适用于ARM和MIPS架构,而非单一架构,并且在分析不同架构的固件时无需做任何修改,具有强大的通用型。

装置实施例一

本发明实施例提供了一种电子设备,包括:

处理器;以及,

被安排成存储计算机可执行指令的存储器,所述计算机可执行指令在被执行时使所述处理器执行如上述方法实施例所述的步骤。

装置实施例二

本发明实施例提供了一种存储介质,用于存储计算机可执行指令,所述计算机可执行指令在被执行时实现如上述方法实施例所述的步骤。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

技术分类

06120116334734