整形溢出漏洞的二进制检测定位装置转让专利

申请号 : CN200910025885.X

文献号 : CN101510241B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈平王逸辛知茅兵谢立

申请人 : 南京大学

摘要 :

本发明公开了一种整形溢出漏洞的二进制检测定位装置,该装置包括以下单元:用于将二进制代码转换成VEX中间代码的代码转换单元;信息记录单元,所述信息记录单元包括:用于记录变量的类型信息的类型信息提取模块;用于记录变量的最新值的数值信息提取模块;用于记录算术运算及其操作数的算术运算提取模块;用于记录赋给变量最新值指令地址的指令地址提取模块;检测定位单元,所述检测定位单元包括:整形数上溢出检测模块以及整形数下溢出检测模块。本发明提出了一种整形溢出漏洞的二进制检测定位装置,不需要源代码,全自动的运行,不需要人工干预,能准确定位漏洞代码。

权利要求 :

1.一种整形溢出漏洞的二进制检测定位装置,其特征在于,该装置包括以下单元:用于将二进制代码转换成VEX中间代码的代码转换单元(20);

信息记录单元(21),所述信息记录单元(21)包括:用于记录变量的类型信息的类型信息提取模块(211);用于记录变量的最新值的数值信息提取模块(212);用于记录算术运算及其操作数的算术运算提取模块(213);用于记录赋给变量最新值指令地址的指令地址提取模块(214);

检测定位单元(22),所述检测定位单元(22)包括:整形数上溢出检测模块(221)以及整形数下溢出检测模块(222);

所述整形数上溢出检测模块(221)包括以下步骤:

步骤S100,根据信息记录单元(21)提取的宽度信息,判断操作数的长度n,有三种类型8bits,16bits,32bits;

步骤S200,根据信息记录单元(21)提取的类型信息,判断操作数的符号类型是无符号数,还是有符号数,并结合宽度信息,记操作数的类型为Signed n或者Unsigned n,如果是有符号数则执行步骤S300,否则执行步骤S400;

步骤S300,根据信息记录单元(21)提取的算术运算信息,判断与该操作数相关的算术运算是加法还是乘法操作,如果是有符号数加法运算执行步骤S500,如果是有符号数乘法运算执行步骤S600;如果既不是加法运算也不是乘法运算,则执行步骤S900;

步骤S400,根据信息记录单元(21)提取的算术运算信息,判断与该操作数相关的算术运算是加法还是乘法操作,如果是无符号数加法运算,则执行步骤S700,如果是无符号数乘法运算,执行步骤S800;如果既不是加法运算也不是乘法运算,则执行步骤S900;

步骤S500,根据信息记录单元(21)提取的操作数最新值信息,即程序运行时该操作数当前的值,判断加法运算的两个操作数是否同号,如果两个操作数同号,执行步骤S501,否则执行步骤S900;

步骤S501,根据信息记录单元(21)提取的操作数最新值信息,判断两个操作数是否均为负数,如果两个操作数均为正数执行步骤S502,否则执行步骤S503;

步骤S502,如果两个操作数均为正数,判断是否两个正数相加有整形数上溢出;如果有整形上溢出,判定为漏洞,执行步骤S1000,否则执行步骤S900继续运行;

步骤S503,如果两个操作数均为负数,判断两个负数相加是否有整形数上溢出发生;如果有上溢出,判定为漏洞,执行步骤S1000,否则执行步骤S900继续运行;

步骤S600,判断有符号数乘法是否溢出,包括以下步骤:

步骤S601,判断乘法运算的两个操作数是否同号,如果两个操作数同号,则执行步骤S602,否则执行步骤S603;

步骤S602,根据步骤S500中信息记录单元(21)提取的操作数最新值信息,判断两个操作数是否均为负数,如果两个操作数均为负数执行步骤S604,否则执行步骤S605;

步骤S603,判断第一操作数arg1的符号:

如果第一操作数arg1是负数,则第二操作数arg2为正数,执行步骤S606;如果第一操作数arg1是正数,则第二操作数arg2为负数,执行步骤S607;

步骤S604,如果两个操作数均是负数,判断两个负数相乘是否有整形数上溢出发生,如果有,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;

步骤S605,如果两个操作数均是正数,判断两个正数相乘是否有整形数上溢出发生,如果有上溢出发生,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;

步骤S606,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;

步骤S607,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;

步骤S700,判断无符号数加法运算是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;

步骤S800,判断无符号数乘法运算是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900继续运行;

步骤S900,程序没有检测到整形上溢出,继续正常运行;

步骤S1000,根据信息记录单元(21)提取的指令地址信息,并由信息记录单元(21)记录该指令地址信息;

所述整形数下溢出检测模块(222)包括以下步骤:

步骤S1010,根据信息记录单元(21)提取的宽度信息,判断操作数的长度n,有三种类型8bits,16bits,32bits;

步骤S1020,根据信息记录单元(21)提取的类型信息,判断操作数的符号类型是无符号数,还是有符号数,并结合宽度信息,分别记录操作数的类型为Signedn或者Unsigned n,如果是有符号数则执行步骤S1100,否则执行步骤S1105;

步骤S1100判断与该操作数相关的算术运算是否为减法运算,如果是有符号数减法操作,则执行步骤S1101;如果不是减法运算,则执行步骤S1107;

步骤S1101,根据信息提取单元(21)提取的操作数最新值信息,并判断减法操作的两个操作数是否同号,如果两个操作数异号,则执行步骤S1102,否则执行步骤S1107;

步骤S1102,判断第一操作数arg1的符号:

如果第一操作数arg1是负数,则第二操作数arg2为正数,执行步骤S1103;

如果第一操作数arg1是正数,则第二操作数arg2为负数,执行步骤S1104;

步骤S1103,判断是否有整形数下溢出发生;如果发现漏洞,执行步骤S1108,否则执行步骤S1107;

步骤S1104,判断是否有整形数下溢出发生;如果发现漏洞,执行步骤S1108,否则执行步骤S1107;

步骤S1105,如果是无符号数减法操作则执行步骤S1106;如果不是减法运算,则执行步骤S1107;

步骤S1106,判断无符号数减法是否有整形数下溢出发生,有则判定为漏洞,并执行步骤S1108,否则执行步骤S1107;

步骤S1107,程序没有检测到整形下溢出,继续正常运行;

步骤S1108,根据信息记录单元(21)提取的指令地址信息,并由信息记录单元(21)记录该指令地址信息。

2.根据权利要求1所述的整形溢出漏洞的二进制检测定位装置,其特征在于,所述代码转换单元(20)通过二进制分析工具Valgrind将二进制代码转换成VEX中间代码;包括:对寄存器的读/写指令、对内存的读/写指令、对临时变量的读/写指令、对常量的读指令。

3.根据权利要求2所述的整形溢出漏洞的二进制检测定位装置,其特征在于,所述二进制分析工具Valgrind插入类型引用插件Catchconv后,所述类型信息提取模块(211)的类型信息通过符号跳转指令、库函数定义以及操作数的大小信息获得。

4.根据权利要求3所述的整形溢出漏洞的二进制检测定位装置,其特征在于,类型信息提取模块(211)提取的类型信息包括宽度信息和符号信息;所述宽度信息包括:8bits、16bits、32bits;符号信息包括:有符号和无符号。

5.根据权利要求4所述的整形溢出漏洞的二进制检测定位装置,其特征在于,所述数值信息提取模块(212)将内存写指令所写的数值记录下来,并且通过内存读指令、寄存器读写指令、临时变量读写指令,将数值传递给寄存器以及临时变量。

6.根据权利要求4所述的整形溢出漏洞的二进制检测定位装置,其特征在于,所述指令地址提取模块(214)记录内存写操作以及算术运算所对应的指令地址。

说明书 :

技术领域

本发明提供了一种二进制漏洞的检测定位装置,特别是一种整形溢出漏洞的二进制检测定位装置。

背景技术

整形溢出漏洞是著名的软件安全漏洞之一,在C或C++程序中尤为突出。整形溢出漏洞分为两类:整形下溢出(IntegerUnderflow);(2)整形上溢出(IntegerOverflow)。2006年CVE(CommonVulnerabilityandExploit)指出缓冲区溢出漏洞(bufferoverflow)呈下降趋势,而整形溢出漏洞呈上升趋势。值得注意的是,2006年整形溢出在系统漏洞中的排名首次升至第二位,仅次于缓冲区溢出。更重要的是,整形溢出漏洞往往会触发很严重的攻击,如任意代码执行(arbitrarycodeexecution),拒绝服务攻击(denialofservice),等等。
整形溢出漏洞一般与程序语义相关,因此很难被检测和定位。程序员经常忽视,甚至对整形溢出漏洞知之甚少。标准编译器,如GCC,对整形溢出漏洞也不能提供警告或错误信息。更糟糕的是,整形溢出漏洞常常与某些攻击方法结合,共同产生内存错误。现有的安全工具几乎都不能检测并定位整形漏洞。
此外,与有源代码的程序相比,二进制程序缺少显式的类型信息,需要从某些特定的操作和函数定义中获得这些信息。
特别是,目前整形溢出漏洞检测工具很少,而且至少存在如下的缺点之一:(1)需要源代码(2)人工参与(3)检测误报率和漏报率高(4)不能定位整形漏洞代码。目前,在二进制程序分析工具中,典型的工具是Valgrind,它将二进制代码转换成VEX中间代码,并在此中间代码上进行分析。在Valgrind上,已经出现了许多功能插件,如内存错误分析插件Memcheck,类型引用插件Catchconv等。本发明基于Valgrind以及Catchconv,检测和定位整形溢出。相关文献可见N.Nethercoteand J.Seward.Valgrind:A framework for heavy weight dynamic binary instrumentation.In Proceedings of PLDI 2007,San Diego,California,USA,June 2007;J.Seward andN.Nethercote.Using valgrind to detect undefined value errors with bit-precision.In Proceedings of the USENIX05Annual Technical Conference,Anaheim,California,USA,April 2005;D.A.Molnar and D.Wagner.Catchconv:Symbolic execution and run-timetype inference for integer conversion errors.Technical Report UCB/EECS-2007-23,EECSDepartment,University of California,Berkeley,February 2007。

发明内容

发明目的:本发明的目的在于针对现有技术的不足,提供一种对没有源代码的二进制程序的进行保护的整形溢出漏洞的二进制检测定位装置。
技术方案:本发明公开了一种整形溢出漏洞的二进制检测定位装置,该装置包括以下单元:
用于将二进制代码转换成VEX中间代码的代码转换单元;
信息记录单元,所述信息记录单元包括:用于记录变量的类型信息的类型信息提取模块;用于记录变量的最新值的数值信息提取模块;用于记录算术运算及其操作数的算术运算提取模块;用于记录赋给变量最新值指令地址的指令地址提取模块;
检测定位单元,所述检测定位单元包括:整形数上溢出检测模块以及整形数下溢出检测模块。
本发明中,优选地,所述代码转换单元通过二进制分析工具Valgrind将二进制代码转换成指令代码集VEX;包括:对寄存器的读/写指令、对内存的读/写指令、对临时变量的读/写指令、对常量的读指令。
本发明中,优选地,所述二进制分析工具Valgrind插入类型引用插件Catchconv后,所述类型信息提取模块的类型信息通过符号跳转指令、库函数定义以及操作数的大小信息获得。
本发明中,优选地,类型信息提取模块提取的类型信息包括宽度信息和符号信息;所述宽度信息包括:8bits、16bits、32bits;符号信息包括:有符号和无符号。
本发明中,优选地,所述数值信息提取模块将内存写指令所写的数值记录下来,并且通过内存读指令,寄存器读写指令,临时变量读写指令,将数值传递给寄存器以及临时变量。本发明为每个内存变量、寄存器以及临时变量分配额外的数值空间,用来存放它们的最新值。所谓最新值,是指程序执行时刻该操作数的值。分两种情况记录数值信息:(1)当遇到内存写指令时,将所写的数值作为该内存变量最新值记录下来;(2)当遇到内存、寄存器或临时变量读指令时,先将读出的数值保存,并将该数值通过寄存器、临时变量写指令,暂时保存在寄存器或临时变量中,该数值会随着赋值,运算等操作传播。
本发明中,优选地,所述指令地址提取模块记录内存写操作以及算术运算所对应的指令地址。该地址信息由VEX语句Ist_Imark提供,记录在该指令对应的操作数中。本发明为每个内存变量、寄存器以及临时变量分配额外的地址空间,用来记录指令地址。
本发明中,优选地,所述整形数上溢出检测模块包括以下步骤:
步骤S100,根据信息记录单元提取的宽度信息,判断操作数的长度n,有三种类型8bits,16bits,32bits;
步骤S200,根据信息记录单元提取的类型信息,判断操作数的符号类型是无符号数,还是有符号数,并结合宽度信息,记操作数的类型为Signed n或者Unsigned n,如果是有符号数则执行步骤S300,否则执行步骤S400;
步骤S300,则根据信息记录单元提取的算术运算信息,判断与该操作数相关的算术运算是加法还是乘法操作,如果是有符号数加法运算执行步骤S500,否则执行步骤S600;如果既不是加法运算也不是乘法运算,则执行步骤S900;
步骤S400,根据信息记录单元提取的算术运算信息,判断与该操作数相关的算术运算是加法还是乘法操作,如果是加法运算,则执行步骤S700,否则执行步骤S800;如果既不是加法运算也不是乘法运算,则执行步骤S900;
步骤S500,根据信息记录单元提取的操作数最新值信息,即程序运行时该操作数当前的值,判断加法运算的两个操作数是否同号,如果两个操作数同号,执行步骤S501,否则执行步骤S900;
步骤S501,根据信息记录单元提取的操作数最新值信息,判断两个操作数是否均为负数,如果两个操作数均为正数执行步骤S502,否则执行步骤S503;
步骤S502,判断是否两个正数相加有整形数上溢出。,如果有整形上溢出,判定为漏洞,执行步骤S1000,否则执行步骤S900;
步骤S503,如果两个操作数均为负数,判断两个负数相加是否有整形数上溢出发生;如果有上溢出,判定为漏洞,执行步骤S1000,否则执行步骤S900;
步骤S600,判断有符号数乘法是否溢出,包括以下步骤:
步骤S601,判断乘法运算的两个操作数是否同号,如果两个操作数同号,则执行步骤S602,否则执行步骤S603;
步骤S602,根据信息记录单元提取的操作数最新值信息,判断两个操作数是否均为负数,如果两个操作数均为负数执行步骤S604,否则执行步骤S605;
步骤S603,判断第一操作数arg1的符号。
如果第一操作数arg1是负数,由步骤S601可知,第二操作数arg2为正数,则执行步骤S606,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900继续运行;
如果第一操作数arg1是正数,由步骤S601可知,第二操作数arg2为负数,则执行步骤S607,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900继续运行;
步骤S604,判断是否有整形数上溢出发生,如果有,则判定为漏洞,并执行步骤S1000,否则执行步骤S900继续运行;
步骤S605,判断是否有整形数上溢出发生,如果有上溢出发生,则判定为漏洞,并执行步骤S1000,否则执行步骤S900。
步骤S700,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;
步骤S800,判断是否有整形数上溢出发生,如果有上溢出,则判定为漏洞,并执行步骤S1000,否则执行步骤S900;
步骤S900,程序没有检测到整形上溢出,继续正常运行。
步骤S1000,根据信息记录单元提取的指令地址信息,并由信息记录单元记录该指令地址信息。该地址信息就是整形上溢出漏洞的定位点,报告该地址,整形上溢出检测和定位完成。
本发明中,优选地,所述整形数下溢出检测模块包括以下步骤:
步骤S1010,根据信息记录单元提取的宽度信息,判断操作数的长度n,有三种类型8bits,16bits,32bits;
步骤S1020,根据信息记录单元提取的类型信息,判断操作数的符号类型是无符号数,还是有符号数,并结合宽度信息,分别记录操作数的类型为Signed n或者Unsigned n,如果是有符号数则执行步骤S1100,否则执行步骤S1105;
步骤S1100判断与该操作数相关的算术运算是否为减法运算,如果是有符号数减法操作,则执行步骤S1101;如果不是减法运算,则执行步骤S1107。
步骤S1101,根据信息提取单元提取的操作数最新值信息,并判断减法操作的两个操作数是否同号,如果两个操作数异号,则执行步骤S1102,否则执行步骤S1107;
步骤S1102,判断第一操作数arg1的符号。
如果第一操作数arg1是负数,由步骤S1101可知,第二操作数arg2为正数,则执行步骤S1103。判断是否有整形数下溢出发生。如果发现漏洞,执行步骤S1108,根据信息提取单元提取的指令地址信息,定位该漏洞,否则执行步骤S1107继续运行。
如果第一操作数arg1是正数,由步骤S1101可知,第二操作数arg2为负数,则执行步骤S1104。判断是否有整形数下溢出发生。如果发现漏洞,执行步骤S1108,根据信息提取单元21提取的指令地址信息,定位该漏洞,否则执行步骤S1107继续运行。
步骤S1105,如果是无符号数减法操作则执行步骤S1106;如果不是减法运算,则执行步骤S1107;
步骤S1106,判断是否有整形数下溢出发生,有则判定为漏洞,并执行步骤S1108,否则执行步骤S1107继续运行;
步骤S1107,指程序没有检测到整形下溢出,继续正常运行。
步骤S1108,根据信息记录单元(21)提取的指令地址信息,并由信息记录单元记录该指令地址信息。该地址信息就是整形下溢出漏洞的定位点,报告该地址,整形下溢出检测和定位完成。
本发明的工作流程可以分为三步:首先,由代码转换单元20将二进制码转换成中间语言VEX,代码转换单元是由二进制分析工具Valgrind完成的。其次,程序运行时,根据所执行的VEX语句和表达式,由信息记录单元21提取和记录相应的信息。最后,由检测定位单元22根据记录的信息,检测和定位整形溢出漏洞。
有益效果:本发明提出了一种整形溢出漏洞的二进制检测定位装置,不需要源代码,全自动的运行,不需要人工干预,能准确定位漏洞代码。
本发明选取了一些具有代表性的软件对本发明进行测试。实验的主要目的是评价本发明检测整形漏洞的有效性。实验平台:
IntelPentium(R)DualE21802.00GHz,256MB内存和Linux2.6.15内核。测试程序均由gcc-3.4.0编译,以及glibc2.3.2连接。
本发明选择了如下软件评估检测整形漏洞的有效性:
VLCMediaPlayer0.8.6i,PHP5.2.5,Linuxkernel2.6.19.2,GOCR0.4.0等。由于整形溢出漏洞很难被模拟,在实验中,本发明从每个软件中提取漏洞代码,加上导致错误的输入,转换成相对较小的,独立的漏洞程序进行检测。这些程序在本发明的监控下运行。
图9是有效性测试结果,漏洞均被检测并定位。本发明同样测试了误报率,发现误报率很低,通常发生在编译器优化时,编译器添加溢出代码达到优化的效果。
与目前的整形溢出漏洞检测工具相比,本发明至少有四个的特点:(1)二进制级:不需要源代码。(2)实时检测:程序运行时检测整形漏洞。(3)低误报和漏报率。(4)能够准确定位整形漏洞代码。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
图1是本发明的系统结构示意图。
图2是VEX指令集构成图。
图3是本发明类型信息提取模块的结构示意图。
图4是本发明由比较操作提取符号类型信息示意图。
图5是本发明由库函数定义提取符号类型信息示意图。
图6是本发明整形数上溢出检测模块的实施流程示意图;其中,MaxU/MinU表示n位无符号整数的最大/最小值;MaxS/MinS表示n位有符号整数的最大/最小值。arg1和arg2表示算术运算的第一和第二操作数。
图7是本发明判断有符号数乘法溢出的实施流程示意图。
图8是本发明整形数下溢出检测模块的实施流程示意图。
图9是本发明有效性测试结果。

具体实施方式

本发明建立在Valgrind3.2.2和Catchconv0.1的基础上。
图1是本发明的系统结构示意图。如图1所示,本发明所述的整形溢出漏洞的二进制检测定位装置10包括:代码转换单元20,信息记录单元21,检测定位单元22。
所述代码转换单元20用于将二进制代码转换成与平台无关的Valgrind中间代码VEX,所述VEX是一种精简指令集,VEX指令集的语句有10种,表达式有12种。图2是VEX指令集。如图2所示,VEX指令集分为语句和表达式。语句和表达式的区别是,语句修改寄存器/内存/临时变量,而表达式仅使用寄存器/内存/临时变量的值。在VEX指令集中数据对象分为四类:寄存器,内存,临时变量,常量。对寄存器的读写指令为:Ist_Put,Iex_Get。对内存的读写指令为:Ist_Store,Iex_Load。对临时变量的读写指令为:Ist_tmp,Iex_tmp。对常量的读指令为Iex_Const。
所述信息记录单元21根据程序运行时执行到的VEX指令,记录四类信息来检测和定位整形漏洞:(1)变量的类型信息,(2)变量的最新值,(3)与变量相关的最近的算术运算,(4)赋给变量最新值的指令地址。这四类信息分别由“类型信息提取模块211”,“数值信息提取模块212”,“算术运算提取模块213”以及“指令地址提取模块214”记录。
所述类型信息提取模块211是建立在Valgrind插件Catchconv基础上。类型信息可以分为宽度信息和符号信息。宽度信息可以分为,8bits,16bits,32bits。符号信息可以分为,有符号和无符号。图3是类型信息提取模块211的结构示意图。如图3所示,宽度信息可以从寄存器/内存/临时变量读写指令中提取。符号信息可以从二元运算中的比较操作以及库函数定义中提取。
图4是从二元运算中的比较操作提取符号类型信息的示意图。图中“”可以取8,16,32,分别表示8bits,16bits,32bits。根据有符号比较和无符号比较操作,提取符号类型信息。并将符号类型信息记录在比较操作对应的操作数上。
图5是从库函数定义提取符号类型信息的示意图。本发明从C库函数中选取了较常用的22个函数,并且根据定义的函数参数的符号类型,提取符号类型信息。并且记录在参数对应的操作数上。
所述数值信息提取模块212,将内存写指令Ist_Store所写的数值记录下来,并且通过内存读指令,寄存器读写指令,临时变量读写指令,将数值传递给寄存器,临时变量。本发明为每个内存变量、寄存器以及临时变量分配额外的数值空间,用来存放它们的最新值。所谓最新值,是指程序执行时刻该操作数的值。分两种情况记录数值信息:(1)当遇到内存写指令时,将所写的数值作为该内存变量最新值记录下来;(2)当遇到内存、寄存器或临时变量读指令时,先将读出的数值保存,并将该数值通过寄存器、临时变量写指令,暂时保存在寄存器或临时变量中,该数值会随着赋值,运算等操作传播。
所述算术运算提取模块213,将算术运算及其操作数记录下来,为后面漏洞的检测提供信息。本发明考虑三种算术运算,加、减、乘。本发明为每个算术运算结果所对应的操作数分配额外的空间,记录该算术运算的名称以及操作数。
所述地址提取模块214,将内存写操作Ist_Store以及算术运算所对应的指令地址Ist_Mark记录下来。为后面漏洞的定位提供信息。
所述检测定位单元22包括针对整形数上溢出检测和定位的整形数上溢出检测模块221,针对整形数下溢出检测和定位的整形数下溢出检测模块222。
图6是整形数上溢出检测模块221的实施流程示意图。如图6所示,整形数上溢出检测和定位的步骤具体包括。
如图6所示,步骤S100根据信息记录单元21提取的宽度信息,判断操作数的长度n,有三种可能8bits,16bits,32bits。
步骤S200根据信息记录单元21提取的类型信息,判断操作数的符号类型,即判断是无符号数,还是有符号数。结合宽度信息,记操作数的类型为Signed n或者Unsigned n。
步骤S300,如果是有符号数,则根据信息记录单元21提取的算术运算信息,判断与该操作数相关的算术运算是加法(Add)还是乘法(Mul)操作。如果是有符号数加法运算执行步骤S500,如果是有符号数乘法运算执行步骤S600;如果既不是加法运算也不是乘法运算,则执行步骤S900;
步骤S500,如果是有符号数加法运算,则根据信息记录单元21提取的操作数最新值信息,判断加法运算的两个操作数是否同号。
步骤S501,如果两个操作数同号,则根据信息记录单元21提取的操作数最新值信息,判断两个操作数是否均为负数。如果均为正数,则执行步骤S502;如果均为负数,则执行步骤S503。
步骤S502,如果两个操作数均为正数,则判断是否有整形数上溢出发生。判断是否溢出的公式为“arg1<=MaxS-arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MaxS是该宽度类型所能表示的有符号数最大值。例如:c=a+b,arg1为a,arg2为b,假设a与b均为32位有符号正数,那么MaxS=2147483647。
步骤S503,如果两个操作数均为负数,则判断是否有整形数上溢出发生。判断是否溢出的公式为“arg1>=MinS-arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MinS是该宽度类型所能表示的有符号数最小值。仍以c=a+b为例,arg1为a,arg2为b,假设a与b均为32位有符号负数,那么MinS=-2147483648。
步骤S600,如果是有符号数乘法,则执行步骤S600,图7是判断有符号数乘法的实施流程示意图。
如图7所示,步骤S601判断乘法运算的两个操作数是否同号。
步骤S602,如果两个操作数同号,则根据信息记录单元21提取的操作数最新值信息,判断两个操作数是否均为负数。如果均为正数,则执行步骤S605;如果均为负数,则执行步骤S604。
步骤S604,如果两个操作数均为负数,则判断是否有整形数上溢出发生。判断溢出的公式为“arg2>=MaxS/arg1”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MaxS是该宽度类型所能表示的有符号数最大值。以c=a*b为例,arg1为a,arg2为b,假设a与b均为32位有符号负数,那么MaxS=2147483647。
步骤S605,如果两个操作数均为正数,则判断是否有整形数上溢出发生。判断溢出的公式为“arg2<=MaxS/arg1”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MaxS是该宽度类型所能表示的有符号数最大值。以c=a*b为例,arg1为a,arg2为b,假设a与b均为32位有符号负数,那么MaxS=2147483647。
步骤S602,如果两个操作数异号,则根据信息记录单元21提取的操作数最新值信息,判断操作数arg1的符号。
如果arg1是负数,由步骤S601可知,arg2为正数,则执行步骤S606,判断是否有整形数上溢出发生。判断公式为“arg2<=MinS/arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MinS是该宽度类型所能表示的有符号数最小值。以c=a*b为例,arg1为a,arg2为b,假设a为32位有符号负数,b为32位有符号正数,那么MinS=-2147483648。
如果arg1是正数,由步骤S601可知,arg2为负数,则执行步骤S607,判断是否有整形数上溢出发生。判断公式为“arg2>=MinS/arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,根据操作数的宽度类型,MinS是该宽度类型所能表示的有符号数最小值。以c=a*b为例,arg1为a,arg2为b,假设a为32位有符号正数,b为32位有符号负数,那么MinS=-2147483648。
步骤S400,如果是无符号数,则根据信息记录单元21提取的算术运算信息,判断与该操作数相关的算术运算是加法(Add)还是乘法(Mul)操作。如果是无符号数加法运算,则执行步骤S700,如果是无符号数乘法运算,执行步骤S800;如果既不是加法运算也不是乘法运算,则执行步骤S900。
步骤S700,如果是无符号数加法运算,则判断是否有整形数上溢出发生。判断是否溢出的公式为“arg1<=MaxU-arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,MaxU是根据操作数类型而定的最大值。以c=a+b为例,arg1为a,arg2为b。假设a和b均是32位无符号数,那么MaxU=4294967295。
步骤S800,如果是无符号数乘法运算,则判断是否有整形数上溢出发生。判断是否溢出的公式为“arg1<=MaxU/arg2”。如果此公式不满足,则发现漏洞,执行步骤S1000,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S900。其中,MaxU是根据操作数类型而定的最大值,以c=a*b为例,arg1为a,arg2为b。假设a和b均是32位无符号数,那么MaxU=4294967295。
图8是整形数下溢出检测模块222的实施流程示意图。如图8所示,所述整形数下溢出检测模块222包括以下步骤:
步骤S1010,根据信息记录单元21提取的宽度信息,判断操作数的长度n,有三种类型8bits,16bits,32bits;
步骤S1020,根据信息记录单元21提取的类型信息,判断操作数的符号类型是无符号数,还是有符号数,并结合宽度信息,分别记录操作数的类型为Signed n或者Unsigned n,如果是有符号数则执行步骤S1100,否则执行步骤S1105;
步骤S1100判断与该操作数相关的算术运算是否为减法运算,如果是有符号数减法操作,则执行步骤S1101;如果不是减法运算,程序继续正常运行。步骤S1101,根据信息提取单元21提取的操作数最新值信息,并判断减法操作的两个操作数是否同号,如果两个操作数异号,则执行步骤S1103,否则执行步骤S1107;
步骤S1102,判断操作数的符号。
如果arg1是负数,由步骤S1101可知,arg2为正数,则执行步骤S1103。判断是否有整形数下溢出发生。判断公式为“arg1>=MinS+arg2”。如果此公式不满足,则发现漏洞,执行步骤S1108,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S1107。其中,根据操作数的宽度类型,MinS是该宽度类型所能表示的有符号数最小值。以c=a-b为例,arg1为a,arg2为b,假设a为32位有符号负数,b为32位有符号正数,那么MinS=-2147483648。
如果arg1是正数,由步骤S1101可知,arg2为负数,则执行步骤S1104。判断是否有整形数下溢出发生。判断公式为“arg1<=MaxS+arg2”。如果此公式不满足,则发现漏洞,执行步骤S1108,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S1107。其中,根据操作数的宽度类型,MinS是该宽度类型所能表示的有符号数最大值。以c=a-b为例,arg1为a,arg2为b,假设a为32位有符号正数,b为32位有符号负数,那么MaxS=2147483647。
步骤S1105,如果是无符号数减法操作则执行步骤S1106;如果不是减法运算,则执行步骤S1107;
步骤S1106,判断是否有整形数下溢出发生,判断公式为“arg1>=arg2”。如果此公式不满足,则发现漏洞,执行步骤S1108,根据信息记录单元21提取的指令地址信息,定位该漏洞。如果公式满足,执行步骤S1107。
步骤S1107,指程序没有检测到整形下溢出,继续正常运行
步骤S1108,根据信息记录单元21提取的指令地址信息,并由信息记录单元21记录该指令地址信息。该地址信息就是整形下溢出漏洞的定位点,报告该地址,整形下溢出检测和定位完成。
本发明提供了一种整形溢出漏洞的二进制检测定位装置的思路及方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部份均可用现有技术加以实现。