一种内存变量分布动态发现方法技术

技术编号:12394789 阅读:56 留言:0更新日期:2015-11-26 01:53
本发明专利技术公开了一种内存变量分布动态发现方法。本方法为:1)根据设定的指令特征从目标软件中选取目标语句;2)生成能够使得该目标软件能够到达该目标语句的输入数据;3)该目标软件执行该输入数据,获取执行该目标语句时的内存变量分布。本发明专利技术无需对所有指令进行分析,能够在缺乏源代码情况下,实现与某指令相关的动态推测内存。

【技术实现步骤摘要】

本专利技术主要涉及一种软件(可执行文件)变量分析方法,更确切地是涉及软件分 析中在缺乏源代码情况下动态推测内存变量分布的方法。
技术介绍
内存变量分析,是软件分析,尤其是漏洞分析、恶意分析中重要的组成部分。在源 代码存在的情况下,可以直接分析源代码中的变量,从而获得内存变量分布。但对于缺乏源 代码的二进制可执行文件,对其内存变量分布的获得显得极为困难。 数据结构反向工程与内存分布发现类似。DIVINE通过使用值集分析和指针分析 算法来恢复变量实体,可以识别栈中88%的变量和堆中89%的变量。但我们的方法更轻量 级。IDA Pro使用一个朴素的算法来推导内存分布,但是对于全局变量和栈只能针对有限 的模式(如" "或" ")。并没有考虑本地变量在堆中通过指针、 结构等进行访问。Laika在图像中识别潜在的指针来估计对象位置和大小,然后通过块类 型类似的序列来检测对象。Reward在一个已知的函数(如系统调用)被调用时首先识别 参数的类型,然后,在程序动态执行过程中传递类型信息。但是,它依靠类型来获得初始类 型。如果数据结构没有在一个众所周知的函数中直接或间接显示,这些数据类型就不会被 识别。实际上,内部的变量和数据结构在程序中占有很大比例。Howard从二进制代码中动 态提取数据结构。与Howard相比,我们的方法是一个轻量级方法,无需对所有指令进行分 析。这样,我们的方法不仅提高了效率,而且降低了处理过程中的误报率。 不变量的产生可以分析程序流程中不改变值的变量,一定程度上与本专利申请相 关。Daikon从程序执行过程中检测不变量,通过插入源程序来跟踪感兴趣的变量,然后运行 插入的程序并输入一些测试集,并推导插入变量和推导出的变量,这些变量在源程序中都 没有出现。这个方法被用在多个安全领域中,如逻辑漏洞检测、行为模型产生等。但是这些 方法有一些不足:1)它们使用随机输入来产生程序路径,因此覆盖率不高。2)它们需要手 动指出要分析的变量。3)它们从路径中分析变量,而我们的方法通过分析二进制内存操作 发现可能的内存分布。WIT将内存操作集的指令看作不变量和插入代码来阻止修改不在集 合中的对象。我们使用该方法作为标记指令。 上述方法存在自动化程度不高、分析方法复杂的问题,本专利技术主要对指令执行过 程分析,提出,解决在缺乏源代码情况下,实现与某指令相 关的动态推测内存。
技术实现思路
针对上述问题,本专利技术的目的在于能够在不需要源码的情况下,通过对目标软件 动态分析,从而发现与某程序语句相关的内存变量分布发现方法。由于内存变量结构随着 程序的运行可能随时发生变化,因此在动态分析过程中需要确定某条程序语句,并观察程 序执行到该语句时刻内存变量分布情况。具体分析过程如下:首先,选择程序中需要分析的 目标语句。例如该语句是漏洞可能存在的语句,或者是恶意代码所需要的敏感操作。其次, 生成能够使得程序到达该目标语句的输入。由于程序运行过程与外界输入密切相关,不同 的输入可能使得程序执行不同的路径。为了能够使得程序到达目标指令,需要构建特定的 输入。第三,当程序以构建的特定输入执行,对程序中被执行的目标语句进行分析,获得内 存变量结构。具体实现流程如下: 1)根据目标语句选取内存:由于内存变量分布随着程序运行随时变化,因此我们 仅关心某个时刻程序的内存变量分布情况,如某条程序语句运行时刻等。这在软件安全漏 洞检测、恶意代码检测中具有重要应用价值。例如我们检测缓冲区溢出漏洞时,可以关注在 潜在错误指令发生的检测点位置操作的相关内存变量分布情况。 2)生成到目标语句的路径:当我们得到候选的目标语句位置(即检测点位置),我 们产生一个路径到达这个位置,然后分析程序执行到这个位置时刻的内存变量分布情况。 首先,产生一个从起始指令语句位置到目标语句位置的静态路径,然后沿着这个静态路径 动态地运行程序,并记录所有依靠这个输入相关的约束条件。通过解决这些约束,我们可以 获得合适的输入,使得程序运行到目标位置。 3)内存变量分布推导:当步骤2)得到的输入进入程序,我们观测在程序中指令是 如何在内存上操作的,然后产生目标指令相关的内存变量分布信息。例如,若目标是识别缓 冲区溢出漏洞,我们就需要首先识别缓冲区边界,即缓冲区及其邻居。我们使用两步方法 来推断内存变量分布。首先,识别在检测点被写的内存块m。通过这种方式,我们不需要分 析每条指令,仅需找到操作内存块m的指令。接着,我们这些指令中推导可能的内存变量分 布,忽略没有在m上操作的指令。 与现有技术相比,本专利技术的积极效果为: 本专利技术自动化程度高,能够同时分析堆和栈中的内存变量,属于一种轻量级方法, 无需对所有指令进行分析,能够在缺乏源代码情况下,实现与某指令相关的动态推测内存。【附图说明】 图1为基本框架图; 图2为举例1中代码的内存分布情况; 图3为举例1中可能的内存分布。【具体实施方式】 首先我们分析一个例子,说明内存变量分布识别。 举例1 :我们有如下二进制代码,我们对其进行分析。 通过分析可知,由于sizein大于0x100程序将退出,但是当sizein等于0x100时, 循环中b将获得用户输入。图2为举例1中相应代码在Microsoft Visual Studio 2005运行时内存中分布情况,而b实际的空间是从b到b ,此时,缓冲区溢出,如 果相邻内存是重要字段,比如size,然后后面举例1中13行,根据这个size再次申请内存, 就可以分配任意大小的缓冲区,恶意用户可以植入代码,给用户带来很大安全威胁。 因此,如图1所示一种动态发现内存分布进行漏洞检测的方法主要包括三部分: 内存选取、路径产生和内存变量分布推导。本专利技术的方法可以在缺乏源代码的情况下,选取 所关注的错误指令发生的检测点位置操作相关内存,然后产生一个可以达到这个位置的路 径输入,最后找到一个输入到达该检测点,获得相关内存变量分布情况。具体过程如下: 1)内存选取。我们需要从整个内存块中选取合适的部分。不同类型的漏洞可能 有不同的指令特征。在二进制代码中错误指令的位置被称为检测位置(check position)。 因此,我们关注在check positions处的内存操作。例如check position可以随意选取一 条可能引发漏洞的指令,例如循环内部的赋值指令。 2)路牷严生。为/严生一个从程序起始指令(写作Is)到目标指令(写作Ie)的 路径,我们首先产生一个从Is到Ie的静态路径。然后沿着静态路径动态运行程序,并记录 依据输入数据的所有约束条件。通过解决这些约束,我们可以获得合适的输入数据,直接让 程序运行到Ie。一个程序调用路径P由多个不同子程序Pi构成,我们产生一个程序调用路 径P,它从起始指令所在的子程序Ps到目标指令所在的子程序Pe。假设Is在程序Ps中, Ie在程序Pe中。我们考虑使用两步方法来产生静态路径:A)产生从Ps到Pe的程序调用 路径P ;B)对于P中每两个临近的节点Pi和Pj产生分支路径Bij。如果Is和Ie是在相 同程序中(如Ps = Pe),我们可以省略步骤A,仅使用步骤B来产生分支路径。 A)程序调用路径产生 假设有两个子程序Ps和Pe (Ps辛Pe)本文档来自技高网
...

【技术保护点】
一种内存变量分布动态发现方法,其步骤为:1)根据设定的指令特征从目标软件中选取目标语句;2)生成能够使得该目标软件能够到达该目标语句的输入数据;3)该目标软件执行该输入数据,获取执行该目标语句时的内存变量分布。

【技术特征摘要】

【专利技术属性】
技术研发人员:陈恺马彬张颖君
申请(专利权)人:中国科学院信息工程研究所
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1