1.一种基于漏洞利用程序特征的程序分析方法,其特征在于,包括以下步骤:
步骤1通过Wireshark对网络流量中的数据进行采集,并对采集的数据包进行还原,获取待检测的漏洞利用程序,之后通过IDA获取待检测程序的汇编代码;
步骤2通过对漏洞利用程序的特征进行分析归纳,从而得到漏洞利用程序的词法、语法和语义特征;
步骤3根据得到的词法、语法和语义特征,构建控制流图生成算法,并通过该算法与获得的待检测程序的汇编代码,生成对应的控制流图;
步骤4对控制流图中的节点信息进行提取,通过JCFG图生成算法,将控制流图转换成对应的JCFG图;
步骤5通过将待检测程序进行动态分析,并通过基于JCFG图的漏洞利用程序检测算法,来对待检测程序进行检测,得到检测结果;
所述步骤5的基于JCFG图的漏洞利用程序检测算法包括:
通过对待检测程序进行动态分析,提取执行指令生成对应的执行节点,与数据库中的JCFG图中的节点进行比较;其中使用的函数定义如下所示:
5.1.函数名称判定函数:程序动态执行时,当前执行指令为调用指令Call的时候,将call后面的调用函数名称与当前JCFG的节点指针对指向的节点的函数名称进行比较,相同返回false,不同返回true;
5.2.跳转地址判定函数:程序动态执行时,当前执行指令为跳转执行JXX时,将后面对应的跳转地址于当前JCFG的节点指针所指向的节点的目的地址JAdress进行比较,相同返回false,不同返回true;
5.3.返回地址判定函数:程序动态执行时,当前执行指令为返回指令Retrun的时候,将执行之后所在的地址与返回地址集合中最上层的地址进行比较,相同返回false,不同返回true;
5.4.指令包含关系:用Include(d,instruction)来对当前执行指令节点d中含有已定义指令instruction进行表示,其中instruction包括了前面所提及的调用指令Call,跳转指令JXX和返回指令Retrun。
2.根据权利要求1所述的一种基于漏洞利用程序特征的程序分析方法,其特征在于,所述步骤2具体包括:通过对网络中的漏洞利用程序的特征进行归纳分析,根据漏洞利用程序中异常跳转的特征进行分析总结,通过对产生异常跳转的漏洞利用程序进行分析,对其中造成危害的指令进行归纳总结,得出漏洞利用程序的程序特征μ的定义,μ(Vul)={D,C};其中Vul表示漏洞利用程序所利用漏洞的漏洞类型,即漏洞利用程序所想要达到的目的,D表示漏洞利用危险节点的集合,对于漏洞利用程序而言,程序Prog中包含漏洞利用危险元素σ的指令,被称作漏洞利用危险节点,D是这些漏洞利用危险节点的集合,D={d1,d2,…,dn};C表示漏洞利用程序的程序特征所需满足的相关漏洞利用约束,C=c1||c2||…||cj||…||cn,对于一个漏洞利用程序而言,它首先需要满足漏洞利用程序的基本约束Bcj,也要满足漏洞利用程序的附加约束Tcj,即cj=Bcj∧Tcj。
3.根据权利要求1所述的一种基于漏洞利用程序特征的程序分析方法,其特征在于,所述步骤3具体包括:根据对漏洞利用程序的词法、语法和语义特征,总结以下定义:
3.1.调用指令Call,用Call表示函数调用指令;
3.2.跳转指令JXX,用JXX表示跳转指令,其中包含了有条件跳转指令JCC和无条件跳转指令jmp,其中CC表示测试条件类型的字符序列,字符序列中包含jz,jnz;
3.3.返回指令Return,用Return表示函数调用指令,其中包括RETN和RETF两种返回指令,RETN是用于从段内转移CALL进的子程序中返回,RETF时用于从段间转CALL进的子程序中返回;
3.4.返回地址集合R,每次执行Call指令之时,将跟在call指令之后的地址存入返回地址集合R中;
3.5.相同节点判定,对于程序而言,有可能存在指令有条件跳转指令之后两条执行路径又重新合并得可能性,因此需要对其进行判定,避免重复,判定函数记作isSame(jAdress);并通过以上定义,得出控制流图的生成算法,用于对待检测的程序进行控制流图的生成,控制流图的生成算法采用的是递归的方式,首先,对待检测程序的汇编代码进行读取,对其中的关键性指令进行处理,对于其中JXX指令或者Return指令改变指令读取的地址,所有的关键指令处理之后,生成对应的指令节点,存储于数据库中。
4.根据权利要求1所述的一种基于漏洞利用程序特征的程序分析方法,其特征在于,所述步骤4的JCFG图生成算法包括:通过对生成的CFG图的节点进行遍历,提取CFG图的节点信息,将CFG图中的每个节点转换成JCFG图节点,生成对应的JCFG图,JCFG图的节点属性数据结构是对CFG图的节点属性的数据结构进行进一步提取,将其细分为指令名称,函数调用名称和目的地址三个部分;指令名称含有两种,分别为之前提及的Call指令和JXX指令;函数调用名称分为两种,对于Call指令,函数调用名称为call指令后面的函数名称,而JXX指令的函数调用名称,当其后面接的操作数为函数时,函数调用名称为函数名,当其后面接的操作数为地址时,函数调用名称中存储的是JXX指令的跳转地址;通过生成的JCFG图便捷地对程序进行分析,减少安全人员的工作量。