一种二进制程序漏洞挖掘方法和系统的制作方法_4

文档序号:9911534阅读:来源:国知局
目的地址。对于我们的系统,也遇到这个问题。解决思路如下:
[0164] 在预处理阶段进行初步静态分析,识别出间接跳转或者间接调用。一旦程序中存 在间接调用,则在转化过程中会生成一个面向所有Promela进程的间接跳转表。当模型检测 过程中遇到间接跳转时,程序首先转到间接跳转表中进行目标进程的搜寻,由于是对所有 Promela进程建立间接跳转表,所以一定能找到,并转到目标进程中。
[0165] 5)漏洞模型
[0166] 对于此漏洞挖掘系统,在进行模型检测前,漏洞模型必然要被插入到Promela模型 中。
[0167] 关于漏洞模型的建立与插入:
[0168] 漏洞模型是此漏洞挖掘系统的灵魂所在。只有建立相应的漏洞模型,才能检测出 对应的程序漏洞。漏洞检测的准确性很大程度上取决于漏洞模型的准确性。关于漏洞模型, 主要有两方面内容需要去做:其一是进行漏洞模型的建立;其二是将漏洞模型插入到 Promela模型中。
[0169] 漏洞模型的建立:
[0170]在此系统中,漏洞模型的建立指用Promela语言对常见的软件漏洞进行建模。这基 于大量的漏洞分析基础之上,通过总结,抽象出漏洞特征,然后使用Promela语言将其描述 出来。以栈溢出漏洞为例进行说明。
[0171] 首先明确,栈溢出指将外部数据放到栈上时,其长度超过应有栈空间而造成的一 种缓冲区溢出漏洞。根据函数调用约定,每个函数都有其独立的栈空间,称为栈帧。栈底是 寄存器EBP所指向的地址,栈顶是寄存器ESP所指向的地址,如图13所示。
[0172] 正常情况下,外部输入数据(这里仅指局部变量)是被放在相应的栈空间中。栈数 据向下增长。如果这些输入数据不加长度检查而直接放入栈空间很容易导致溢出发生。过 长的数据将冲破函数栈帧而覆盖返回地址。
[0173] 当前的各系统都是通过在返回地址前增加校验值来规避栈溢出漏洞。进入函数 后,在返回地址前插入一个随机数并保存副本,在函数体执行完后,系统会检查这个随机值 是否和保存的副本一致。如果不一致,则认为存在栈溢出漏洞。
[0174] 本发明实施例构建的栈溢出漏洞模型如图14所示。
[0175] 如图14所示,进入Promela进程后,首先保存当前栈顶数据和寄存器EBP中的值;在 进程执行结束前,判断保存的数值是否被篡改,如果是,则认为存在栈溢出漏洞。用Promela 语言进行栈溢出漏洞的判定代码如表3所示:
[0176] 表3栈溢出模型中的判定代码
[0177]
[0178] 如表3所示,当检测到漏洞,系统会输出漏洞类型和漏洞所在的位置。并使用 Promela语言中的中断语句停止模型检测。漏洞模型是对现实中软件漏洞特征的高度总结 与抽象,一个漏洞模型的建立意味着这一类的软件漏洞都可以用此模型去检测。
[0179] 漏洞模型的插入:
[0180] 在构建Promela模型时,建立的漏洞模型需要被链接进去。漏洞模型的插入建立在 程序切片和细粒度代码转化的基础上。程序切片将所有代码细节展开,可以根据建立的漏 洞模型将其插入任意想让其存在的位置。
[0181] 以上述栈溢出漏洞模型为例,在进行代码转化时需要将"保存代码"和"检查代码" 分别放在进程的初始位置和结束位置。而且对每个sub函数转化的Promela进程都需要添 加。
[0182] 在程序切片时,将BIL代码分为了以sub函数为单位的函数片断。且获取了函数首 地址和函数地址范围,根据这两个信息,在转化时很容易将栈溢出漏洞的"保存代码"和"检 查代码"插入到其相应位置。
[0183] 外部C代码的引入,除了解决程序执行所需的系统资源以外,还解决了 SPIN所存在 的其他问题。具体地,外部C代码的引入主要是为了解决在模拟执行过程中SPIN无法解决的 问题。这些问题不解决,该漏洞挖掘系统将难以进行正常的模拟执行。主要问题如下:
[0184] >缺少程序执行必要的操作系统资源
[0185] >缺少对临时状态的管理
[0186] >不能处理BIL中的表达式和关键字
[0187] >不能处理BAP无法解析的汇编指令
[0188] 前两个问题是SPIN在模拟执行时遇到的问题,后两个问题是转化阶段所遗留下来 的问题。所有这些问题都可以依靠引入外部C代码来实现。之所以称为"外部C代码"是为了 区别于SPIN平台自己转化的C语言代码。外部C代码解决上述问题的基本原理如下:
[0189] SPIN将Promela模型转化为C代码,然后通过编译执行转化后的C代码进行模型检 测。如果我们用外部C代码实现上述问题,在编译时,将SPIN转化的C代码和外部C代码联合 编译成一个可执行文件。这样,当模型检测时,外部C代码就会修正、解决以上问题。具体地, 外部C代码的设置主要执行以下操作:
[0190] 建立系统环境:
[0191]在程序运行时,栈和堆是必不可少的系统资源。在模拟执行时,该系统需要模拟出 一个虚拟的栈、堆,以便进行数据的存取。
[0192] 1)虚拟栈
[0193] 本发明实施例使用一个大数组来表示虚拟栈。栈上数据的存取相当于对此数组进 行操作。栈上的数据行为比较简单,无非就是入栈和出栈,这本质上和数组的存取无异。所 以,关于栈,只需要维护一个数组即可。
[0194] 2)虚拟堆
[0195] 堆也是由一个大数组来维护,由于堆的动态分配特性,在构建虚拟堆时,我们模拟 了堆的三个操作:堆分配、堆释放与堆合并。参见图15,图15是堆的三种操作。
[0196] 在进行三种操作时,需要维护两个单向链表:一个是空闲表,一个是分配表。分别 表示当前空闲的堆块和已分配的堆块。
[0197] >堆分配:从空闲的虚拟堆区中划分出指定空间,作为分配的堆块,并将此堆块链 入分配表中。
[0198] >堆释放:将指定的堆块从分配表中卸下,并链入空闲表中;
[0199] >堆合并:在每次进行堆分配前,程序都会遍历现有堆块,将相邻的空闲堆块合并 为一个大的空闲堆块。
[0200] 系统环境的建立可以让程序在模拟执行时从虚拟栈、堆上存取数据,保证程序的 正常执行。
[0201] 管理临时状态:
[0202] 一般情况下,临时状态不用去维护,SPIN自己会维护。但如果临时状态进入临时产 生的状态分支,就需要进行状态管理。以打开或者创建一个文件为例:
[0203] 在真实系统中,程序打开或者创建一个文件时,系统会为整个文件分配唯一的标 识符,称之为文件ID。与模型检测不同,真实系统不涉及状态遍历的问题,所以在真实系统 中不用考虑状态管理的问题。在模型检测中,会遇到状态遍历问题,如图16所示。
[0204] 假设在A点处打开一个文件,程序执行过程中产生了 6个状态分支,且分别在分支 〇、分支2和分支5的地方需要关闭打开的文件。模拟执行时,SPIN会依次遍历这6个状态,程 序一共有3处文件关闭,但只有一处文件打开。如果在分支5处关闭文件,那么后续分支会因 找不到文件句柄而出现执行错误。为了解决这个问题,使用一系列函数实现SPIN中临时状 态的管理。具体解决方案如下:
[0205]假设在某节点上产生了 η个状态分支,状态管理程序会为此节点设置一个值为η的 计数器,当执行完一个状态后,η就减1,当全部遍历完,即η = 0时,模型执行才会真正关闭打 开的文件。
[0206] BIL表达式与关键字处理:
[0207] 在转化过程中,BIL中的表达式和关键字被转化为C语言的函数调用模式。比如,表 达式"111611132:1132?118"被转化为1116111_1〇3(1()函数。但在转化后的?1'0111613模型中,只有关于 mem_l 〇ad的函数调用,并没有真正的函数执行体。所以,我们需要在外部C代码中实现mem_ load()函数。具体函数形式如下:
[0208] usize mem_load(usize addr,usize size)
[0209] 参数1:读取数据的内存地址
[0210] 参数2:读取数据的长度(比特)
[0211] 目前,使用外部C代码实现的BIL表达式与关键字如表4所示:
[0212] 表4 BIL关键字与表达式的C函数形式
[0213]
[0214] 表4中,前两个是BIL表达式,后三个是BIL关键字,其都用外部C代码定义并实现。 以mem_load、extend为例,其在Promela模型中的调用代码如下:
[0215] c_code{R_ECX = extend(mem_load(R_EAX,8)) ;};
[0216] 其中,BIL关键字extend的功能是将8或16位数据扩展成32位。
[0217] BAP无法处理的汇编指令:
[0218] BAP平台也是一个不断发展和改进的系统,它能准确地转化大部分汇编指令。但, 并非全部。对于BAP无法处理的指令,也可以通过引入外部C代码来弥补。比如:在最新的 BAP0.8版本中不支持cltd指令的识别,如下表5所示。
[0219] 表5BAP0.8不识别的cltd指令
[0220]
[0221]查看错误信息发现,ΒΑΡ0.8已经不支持单操作数的汇编指令。如果引入外部C代 码,我们只需用C语言实现cltd指令的功能,然后在代码转化阶段将ctld指令转化成相应函 数调用即可。如表6为ctld指令的C语言代码实现:
[0222] 表6ctld指令的C语言代码实现
[0223]
[0224] ctld指令很简单:将long型转化为Double long型。所以,只需要将寄存器EAX中的 数值右移31位,然后赋值给EDX即可。
[0225] 外部C代码的引入使得该漏洞挖掘系统的实现成为可能,它相当于扩展、改进了 SPIN的模型执行,使SPIN变得更为强大。
[0226] 采用本发明实施例的二进制程序漏洞挖据方法和系统分别对Freef
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1