基于自动化识别驱动参数辅助内核漏洞挖掘的方法转让专利

申请号 : CN201710195065.X

文献号 : CN107169362B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李隐峰迟欣茹冉茂锋李苑王雅楠王惟一肖志刚吴文凯

申请人 : 西安电子科技大学

摘要 :

本发明公开了一种基于自动化识别驱动参数辅助内核漏洞挖掘的方法。其实现步骤如下:(1)获取驱动文件的汇编代码和C伪代码;(2)提取汇编代码中的关键特征常量;(3)提取C伪代码中的关键特征常量;(4)对汇编代码和C伪代码两组特征常量进行有效性筛选;(5)得到并输出驱动的有效驱动功能号;(6)输入有效驱动功能号到Windows驱动漏洞挖掘工具中。本发明具有通用性好,识别覆盖面全,准确率高,效率高,且全自动化,简单易用的优点。本发明可用于Windows内核驱动漏洞的挖掘中,可以自动化识别驱动功能号。

权利要求 :

1.一种基于自动化识别驱动参数辅助内核漏洞挖掘的方法,包括步骤如下:(1)获取驱动文件的汇编代码和C伪代码:

利用静态二进制分析工具IDA Pro,获取驱动程序的汇编代码和C伪代码,并将获取的驱动文件的汇编代码和C伪代码分别存储到计算机内存中;

(2)用描述比较、赋值和减法特征的正则表达式与汇编代码匹配,得到汇编代码中的关键特征常量;

所述描述比较、赋值和减法特征的正则表达式如下:

((cmp)|(mov)|(sub))((\t)|()|(\t\t))((eax)|(ebx)|(ecx)|(edx)|(esi)|(edi)),((\t)|(\t\t)|())(([0-9a-fA-F]{4,8}))((h)|(H))其中,cmp表示匹配汇编代码中的比较操作指令,|表示或者操作,mov表示匹配汇编代码中的数据传送指令,sub表示匹配汇编代码中的减法指令,(\t),(\t\t)表示匹配汇编代码中指令之间的制表符,()表示匹配汇编代码中指令间的空格,eax,ebx,ecx,edx,esi,edi表示匹配汇编代码中的指令寄存器,([0-9a-fA-F]{4,8})表示匹配汇编代码中的十六进制常量,且常量位数在4到8个常量字符,((h)|(H))表示匹配汇编代码中常量结尾的h或H标识符;

(3)提取C伪代码中的关键特征常量:

(3a)用描述条件特征的正则表达式与C伪代码匹配,得到C伪代码中if条件判断语句与case语句组合的特征常量;

所述描述条件特征的正则表达式如下:

((<=)|(>=)|(==)|(!=)|=|(-)|<|>|(case))((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))其中,(<=),(>=),(==),(!=)分别表示匹配C伪代码中比较运算里的小于等于,大于等于,等于和不等于操作,|表示或者符号,=,(-),<,>分别表示匹配C伪代码中的赋值操作,相减操作,小于操作和大于操作,(case)表示匹配C伪代码中条件语句中的case语句,(0x[0-9a-fA-F]{5,8})表示匹配十六进制以0x起始的特征常量,且占用5到8个常量字符,(-?[0-9]{5,10})表示匹配十进制数,-?表示匹配的目标常量可以为正数也可以为负数,且占用5到10个常量字符;

(3b)用描述减法特征的正则表达式与C伪代码匹配,得到C伪代码中减法操作组合的特征常量;

所述描述减法特征的正则表达式如下:

(=)()((v|a)[0-9]{1,5})()(-)()((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))其中,(=)表示匹配C伪代码中的赋值操作,()表示匹配C伪代码中的空格符,((v|a)[0-9]{1,5})表示匹配C伪代码中函数的参数和局部变量,(-)匹配C伪代码中的减法操作,(0x[0-9a-fA-F]{5,8})表示匹配C伪代码中以0x开头的特征常量,且占用5到8个常量字符,(-?[0-9]{5,10})表示匹配C伪代码中的十进制数,可以为正数或负数,且占用在5到10个常量字符;

(3c)用描述开关语句特征的正则表达式与C伪代码匹配,得到C伪代码中switch条件组合的特征常量;

所述描述开关语句特征的正则表达式如下:

(switch)()(\\()((v|a)[0-9]{1,5})()((\\+)|(-))()((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))其中,switch表示用于匹配C伪代码中switch分支条件语句,()表示匹配C伪代码中的空格符,(\\()表示匹配C伪代码中的括号和空格符,((v|a)[0-9]{1,5})表示匹配C伪代码中的函数参数和局部变量,((\\+)|(-))表示匹配C伪代码中的加号或者减号,(0x[0-9a-fA-F]{5,8})表示匹配C伪代码中以0x起始的特征常量,且占用5到8个常量字符,(-?[0-9]{5,10})表示匹配C伪代码中的十进制数,可以为正数或负数,且占用5到10个常量字符;

(4)对汇编代码和C伪代码两组特征常量进行有效性筛选:

(4a)对汇编代码和C伪代码两组特征常量,以高16位相同为标准进行分类;

(4b)按照任意两个特征常量需满足差值为4的倍数作为筛选条件,对每一类进行过滤,得到汇编代码和C伪代码的两组有效特征常量;

(5)得到并输出驱动的有效驱动功能号:

(5a)提取汇编代码的有效特征常量和C伪代码的有效特征常量中相同的常量,存入有效驱动功能号集合中;

(5b)将汇编代码的有效特征常量和C伪代码的有效特征常量均存入有效驱动功能号集合中;

(5c)输出有效驱动功能号集合中的所有的有效驱动功能号到计算机内存中;

(6)输入有效驱动功能号到Windows驱动漏洞挖掘工具中:

基于模糊测试的Windows驱动漏洞挖掘工具直接从计算机内存中读取有效驱动功能号,实现自动化内核驱动漏洞挖掘。

说明书 :

基于自动化识别驱动参数辅助内核漏洞挖掘的方法

技术领域

[0001] 本发明涉及计算机技术领域,更进一步涉及软件安全技术领域中的一种基于自动化识别驱动参数的辅助内核漏洞挖掘的方法。本发明可用于对Windows系统内核驱动的漏洞挖掘。

背景技术

[0002] 二进制程序逆向分析和漏洞挖掘一直是软件安全领域研究的首要和关键问题。若要对内核驱动进行漏洞挖掘,需要实现自动化调用驱动的所有功能,以便进行模糊测试来挖掘漏洞。对于Windows操作系统的系统架构而言,按照软件层次可分为两个层次,内核态与用户态。由于用户态与内核态的通信方式,是通过传入驱动设备名和驱动功能号参数来通信的。因此,对于给定的驱动,即设备名已知,若能识别驱动的功能号参数,则能通过该功能号来调用该驱动,为进一步模糊测试挖掘Windows内核驱动漏洞做准备。
[0003] 目前,在二进制漏洞挖掘领域,主要是通过动态调试或静态分析来人工识别驱动功能号参数。第一种动态调试方法,是指通过断点跟踪法,双机调试驱动程序,使其中止在调用某驱动功能的语句上,然后在调试器中查看其传入参数来识别驱动的功能号参数。第二种静态分析方法,是指通过反汇编驱动程序,然后人工分析汇编代码来判断其驱动功能号。但是,动态调试方法不足之处是,需要耗费大量的人力,且代码覆盖率很低,所以很难识别出所有的驱动功能号。静态分析方法的不足之处是,也需要耗费大量的人力,而且随着软件的规模和复杂度越来越高,大大增加了人工静态分析的难度,且准确性差强人意。
[0004] 国外著名安全研究团队MWR  InfoSecurity在其官方网站上(https://labs.mwrinfosecurity.com/tools/win-driver-tool/)公开并开源了win_driver_plugin工具。该工具以IDA Pro软件的插件方式实现,用来辅助逆向分析Windows底层驱动的驱动功能号。该工具通过获取汇编代码结构以及分析在驱动文件里的字符串,猜测驱动设备名以及驱动功能号。但由于该工具必须以IDA Pro软件作为载体,以IDA插件的方式实现,所以需要人工参与去分析识别出来的驱动功能号的准确性,从而导致不能自动化且人为筛选误差较大,并且该工具采用的识别依据不完善,无法识别出switch跳转和隐藏运算后的驱动功能号。因此该工具实现方法存在的不足之处是,采用的识别依据不完善,无法实现自动化、准确度差且识别结果不全面。
[0005] 法国研究者Jérémy Brun在Google Code这个开放的项目托管平台上(https://code.google.com/archive/p/ioctlbf/),公开并开源了工具IOCTLbf。该工具可以用来扫描Windows平台指定驱动有效的驱动功能号。该工具通过过滤和分析DeviceIoControl函数在传入不同的驱动功能号之间的状态差异性,利用Windows错误状态码来识别有效的驱动功能号。由于此工具对有效性的判断完全依赖于驱动在DeviceIoControl函数返回前必须正确设置错误标识,所以这个方法仅对严格按照Windows标准来编码的驱动有一定的识别效果。且需要人为手动指定设备类型和设备支持的一个有效的驱动功能号。更重要的是,绝大部分第三方驱动程序并不会严格遵守Windows异常错误标准来编码驱动,该工具便无法识别此类第三方驱动的有效的驱动功能号。因此,该工具实现方法存在的不足之处是,采用的识别依据不通用,无法实现自动化,且识别覆盖面不足。

发明内容

[0006] 本发明的目的是克服上述现有技术的不足,提出一种可拓展、高精度且通用性好的自动化识别驱动功能号参数的方法来辅助Windows内核驱动漏洞挖掘。本发明充分利用不同驱动程序处理驱动功能号的代码无论在汇编层面还是C伪代码层面均存在规律性,分别通过汇编级匹配和C伪代码级匹配获取驱动功能号的相关特征常量,并将特征常量筛选过滤的方法实现自动化识别内核驱动参数,以解决现有驱动漏洞挖掘技术中需要大量手工操作干预,以及过多依赖安全人员职业经验、准确性低、通用性差和覆盖面不全的问题。
[0007] 本发明的基本思路是:利用静态二进制分析工具IDA Pro,获取驱动程序的汇编代码和C伪代码,按照正则表达式提取汇编代码和C伪代码中的关键特征常量,并将特征常量筛选过滤,最终得到并输出该驱动的有效驱动功能号。
[0008] 实现本发明目的的具体步骤如下:
[0009] (1)获取驱动文件的汇编代码和C伪代码:
[0010] 利用静态二进制分析工具IDA Pro,获取驱动程序的汇编代码和C伪代码,并将获取的驱动文件的汇编代码和C伪代码分别存储到计算机内存中;
[0011] (2)用描述比较、赋值和减法特征的正则表达式与汇编代码匹配,得到汇编代码中的关键特征常量;
[0012] (3)提取C伪代码中的关键特征常量:
[0013] (3a)用描述条件特征的正则表达式与C伪代码匹配,得到C伪代码中if条件判断语句与case语句组合的特征常量;
[0014] (3b)用描述减法特征的正则表达式与C伪代码匹配,得到C伪代码中减法操作组合的特征常量;
[0015] (3c)用描述开关语句特征的正则表达式与C伪代码匹配,得到C伪代码中switch条件组合的特征常量;
[0016] (4)对汇编代码和C伪代码两组特征常量进行有效性筛选:
[0017] (4a)对汇编代码和C伪代码两组特征常量,以高16位相同为标准进行分类;
[0018] (4b)按照任意两个特征常量需满足差值为4的倍数作为筛选条件,对每一类进行过滤,得到汇编代码和C伪代码的两组有效特征常量;
[0019] (5)得到并输出驱动的有效驱动功能号:
[0020] (5a)提取汇编代码的有效特征常量和C伪代码的有效特征常量中相同的常量,存入有效驱动功能号集合中;
[0021] (5b)将汇编代码的有效特征常量和C伪代码的有效特征常量均存入有效驱动功能号集合中;
[0022] (5c)输出有效驱动功能号集合中的所有的有效驱动功能号到内存中;
[0023] (6)输入有效驱动功能号到Windows驱动漏洞挖掘工具中:
[0024] 基于模糊测试的Windows驱动漏洞挖掘工具直接从计算机内存中读取有效驱动功能号,实现自动化内核驱动漏洞挖掘。
[0025] 本发明与现有的技术相比具有以下优点:
[0026] 第一,由于本发明利用四种正则表达式,表示不同驱动程序处理驱动功能号的代码在汇编代码层面和C伪代码层面的规律性,以此作为识别依据提取汇编代码和C伪代码的关键特征常量,克服了现有识别技术由于所采用的识别依据不通用且不完善的缺点,使得本发明具有通用性好,识别覆盖面全的优点。
[0027] 第二,由于本发明采用对特征常量以高16位相同为标准进行分类,再按照任意两个特征常量需满足差值为4的倍数作为筛选条件,对每一类进行过滤,克服了现有技术中由于人为筛选误差大或未筛选而导致识别准确率差的问题,使得本发明具有准确率高,效率高的优点。
[0028] 第三,由于本发明整个过程不需人工干预,自动输出结果,克服了现有技术中仅以插件形式存在无法自动化导出结果的问题,使得本发明具有全自动化,简单易用的优点。

附图说明

[0029] 图1为本发明的流程图。

具体实施方式

[0030] 下面结合附图1对本发明作进一步的详细描述。
[0031] 步骤1,获取驱动文件的汇编代码和C伪代码。
[0032] 利用静态二进制分析工具IDA Pro,获取驱动程序的汇编代码和C伪代码,并将获取的驱动文件的汇编代码和C伪代码分别存储到计算机内存中。
[0033] 步骤2,用描述比较、赋值和减法特征的正则表达式与汇编代码匹配,得到汇编代码中的关键特征常量。描述比较、赋值和减法特征的正则表达式如下:
[0034] ((cmp)|(mov)|(sub))((\t)|()|(\t\t))((eax)|(ebx)|(ecx)|(edx)|(esi)|(edi)),
[0035] ((\t)|(\t\t)|())(([0-9a-fA-F]{4,8}))((h)|(H))
[0036] 其中,cmp表示匹配汇编代码中的比较操作指令,|表示或者操作,mov表示匹配汇编代码中的数据传送指令,sub表示匹配汇编代码中的减法指令,(\t),(\t\t)表示匹配汇编代码中指令之间的制表符,()表示匹配汇编代码中指令间的空格,eax,ebx,ecx,edx,esi,edi表示匹配汇编代码中的指令寄存器,([0-9a-fA-F]{4,8})表示匹配汇编代码中的十六进制常量,且常量位数在4到8个常量字符,((h)|(H))表示匹配汇编代码中常量结尾的h或H标识符。
[0037] 该正则表达式用于提取汇编代码中的常量。本发明的实施例中,对汇编代码cmp eax,12345678h提取到的关键特征常量为12345678h。
[0038] 步骤3,提取C伪代码中的关键特征常量。
[0039] 第一步,用描述条件特征的正则表达式与C伪代码匹配,得到C伪代码中if条件判断语句与case语句组合的特征常量。描述条件特征的正则表达式如下:
[0040] ((<=)|(>=)|(==)|(!=)|=|(-)|<|>|(case))
[0041] ((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))
[0042] 其中,(<=),(>=),(==),(!=)分别表示匹配C伪代码中比较运算里的小于等于,大于等于,等于和不等于操作,|表示或者符号,=,(-),<,>分别表示匹配C伪代码中的赋值操作,相减操作,小于操作和大于操作,(case)表示匹配C伪代码中条件语句中的case语句,(0x[0-9a-fA-F]{5,8})表示匹配十六进制以0x起始的特征常量,且占用5到8个常量字符,(-?[0-9]{5,10})表示匹配十进制数,-?表示匹配的目标常量可以为正数也可以为负数,且占用5到10个常量字符。
[0043] 该正则表达式用于提取C伪代码中if条件判断语句与case语句组合的特征常量。本发明的实施例中,对C伪代码中的if(v5==0x12341234)语句,提取到的关键特征常量为
0x12341234。
[0044] 第二步,用描述减法特征的正则表达式与C伪代码匹配,得到C伪代码中减法操作组合的特征常量。描述减法特征的正则表达式如下:
[0045] (=)()((v|a)[0-9]{1,5})()(-)()((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))[0046] 其中,(=)表示匹配C伪代码中的赋值操作,()表示匹配C伪代码中的空格符,((v|a)[0-9]{1,5})表示匹配C伪代码中函数的参数和局部变量,(-)匹配C伪代码中的减法操作,(0x[0-9a-fA-F]{5,8})表示匹配C伪代码中以0x开头的特征常量,且占用5到8个常量字符,(-?[0-9]{5,10})表示匹配C伪代码中的十进制数,可以为正数或负数,且占用在5到10个常量字符。
[0047] 该正则表达式用于提取C伪代码中减法操作组合的特征常量。本发明的实施例中,对C伪代码中语句组合v2=a1-0x11223344,v2=v1-0x11221122,提取到的关键特征常量为0x11223344和0x11221122。
[0048] 第三步,用描述开关语句特征的正则表达式与C伪代码匹配,得到C伪代码中switch条件组合的特征常量。描述开关语句特征的正则表达式如下:
[0049] (switch)()(\\()((v|a)[0-9]{1,5})()((\\+)|(-))()
[0050] ((0x[0-9a-fA-F]{5,8})|(-?[0-9]{5,10}))
[0051] 其中,switch表示用于匹配C伪代码中switch分支条件语句,()表示匹配C伪代码中的空格符,(\\()表示匹配C伪代码中的括号和空格符,((v|a)[0-9]{1,5})表示匹配C伪代码中的函数参数和局部变量,((\\+)|(-))表示匹配C伪代码中的加号或者减号,(0x[0-9a-fA-F]{5,8})表示匹配C伪代码中以0x起始的特征常量,且占用5到8个常量字符,(-?[0-
9]{5,10})表示匹配C伪代码中的十进制数,可以为正数或负数,且占用5到10个常量字符。
[0052] 该正则表达式用于提取C伪代码中switch条件组合的特征常量。本发明的实施例中,对C伪代码中switch(v1-0x12346789)语句,提取到的关键特征常量为0x12346789。
[0053] 步骤4,对汇编代码和C伪代码两组特征常量进行有效性筛选。
[0054] 第一步,对汇编代码和C伪代码两组特征常量,以高16位相同为标准进行分类。
[0055] 第二步,按照任意两个特征常量需满足差值为4的倍数作为筛选条件,对每一类进行过滤,得到汇编代码和C伪代码的两组有效特征常量。
[0056] 步骤5,得到并输出驱动的有效驱动功能号。
[0057] 第一步,提取汇编代码的有效特征常量和C伪代码的有效特征常量中相同的常量,存入有效驱动功能号集合中。
[0058] 第二步,将汇编代码的有效特征常量和C伪代码的有效特征常量均存入有效驱动功能号集合中。
[0059] 第三步,输出有效驱动功能号集合中的所有的有效驱动功能号到内存中。
[0060] 步骤6,输入有效驱动功能号到Windows驱动漏洞挖掘工具中。
[0061] 基于模糊测试的Windows驱动漏洞挖掘工具直接从计算机内存中读取有效驱动功能号,实现自动化内核驱动漏洞挖掘。
[0062] 下面通过对百度杀毒软件驱动的驱动功能号进行识别,并将识别结果应用到自动化内核驱动漏洞挖掘中,对本发明的效果做进一步的描述。
[0063] 1.测试条件:
[0064] 本发明的测试是在主频3.1GHz的Intel Core i7、内存8.0GB的硬件环境和百度杀毒5.4.3.148966环境下进行的。
[0065] 本发明用到的辅助测试工具有:IDA Pro(交互式反汇编器专业版)。
[0066] 2.测试内容:
[0067] 本发明测试中的测试目标为百度杀毒软件的驱动,以BavR3base.sys驱动为例,对本发明的结果进行验证测试。
[0068] 采用本发明的方法,对百度杀毒驱动BavR3base.sys进行测试,识别出的有效驱动功能号集合为:0x0022e000,0x0022e004,0x0022e008,0x0022e00c,0x0022e010。
[0069] 采用人工分析的方法,对百度杀毒驱动BavR3base.sys进行测试,将百度杀毒驱动BavR3base.sys通过IDA Pro工具反汇编后,进行人工分析有效驱动功能号,分析出的有效驱动功能号集合为:0x0022e000,0x0022e004,0x0022e008,0x0022e00c,0x0022e010。
[0070] 将采用本发明的方法获得的有效驱动功能号,作为基于模糊测试的Windows驱动漏洞挖掘工具的输入,进行自动化内核驱动漏洞挖掘,成功挖掘到BavR3base.sys驱动的一个内存破坏漏洞,出现问题的有效驱动功能号为0x0022e00c,由于处理驱动功能号0x0022e00c时存在堆溢出漏洞,可导致本地拒绝服务攻击并有可能导致本地权限提升。
[0071] 3.测试效果分析:
[0072] 将测试内容中按照本发明的方法和人工分析识别方法识别出的两组有效驱动功能号对比,可以看出按本发明的方法识别出的有效驱动功能号与人工分析识别的结果一致,从而验证了本发明的实用性和准确性。且最后将本发明的方法应用于自动化内核驱动漏洞挖掘中,成功挖掘到百度杀毒软件驱动BavR3base.sys的内存破坏漏洞,验证了本发明的自动化和高效性。