跨平台物联网漏洞挖掘算法评估框架与实现结题报告 漏洞挖掘方法研究过程 跨漏洞挖掘方法 Gemini ACFG提取

Gemini首先需要大量的源代码和对应的汇编代码作为训练数据。这些数据可以从开源项目或者其他途径获取。而在我们的这次项目中不需要进行数据收集阶段,因此为实现Gemini,我们首先需要做的是进行ACFG的提取,接着进行一系列的操作实现代码复现。

2.1.1.1 ACFG提取

收集到的数据需要进行预处理以便于神经网络的训练,此处对应我们进行的ACFG的提取。ACFG的提取方法我们采用和Genius相同方法,大致提取ACFG的过程如下:

1.对给定的源代码进行语法分析,生成语法树。

2.对语法树进行遍历,提取出函数、变量、控制语句等信息,并构建AST(抽象语法树)。

3.对AST进行数据流分析,确定每个变量在程序执行过程中的值和使用情况。

4.在数据流分析的基础上,构建CFG(控制流图),表示程序中各个控制语句之间的依赖关系。

5.将CFG转化为ACFG(抽象控制流图),其中每个节点表示一个代码块,每个边表示控制流经过的条件和可能的路径。ACFG可以用于代码的优化和分析。

提取ACFG的过程是一个复杂的过程,需要对源代码进行多次分析和转换,以确保提取出的ACFG能够准确地反映出程序的控制流程。我们利用交互式反汇编器专业版(Interactive Disassembler Professional)来进行ACFG的提取。它是最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器,是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序,被公认为最好的逆向工程利器,是分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具,支持数十种CPU指令集其中包括Intel x86x64MIPSPowerPCARMZ80,68000,c8051等等。实验进行环境为Python2.7。因为IDA6.8版本的IDApython功能尚不完全,因此事先需要我们手动进行配置,在此不再赘述。ACFG提取的脚本,srtp.py如下:

# -*- coding: utf-8 -*-

import os

import re



# -*- coding: utf-8 -*-

import os

import re



i = 1

while i < 101 :

    # 执行jmeter脚本

    cmd = "C:\\Users\\security\\Desktop\\IDA_6.8\\idaq.exe -c -A -S\"C:\\Users\\security\\" \

          "Desktop\\Gencoding-master\\Gencoding-master\\raw-feature-extractor\\preprocessing_ida.py " \

           "--path  C:\\Users\\security\\Desktop\\test\" data_set/"+str(i)

其中使用的核心脚本函数为preprocessing_ida.py:

from func import *

from raw_graphs import *

from idc import *

import os

import argparse



def parse_command():

   parser = argparse.ArgumentParser(description='Process some integers.')

   parser.add_argument("--path", type=str, help="The directory where to store the generated .ida file")

   args = parser.parse_args()

   return args



if __name__ == '__main__':



   args = parse_command()

   #path = args.path

   path = idc.ARGV[2]

   analysis_flags = idc.GetShortPrm(idc.INF_START_AF)

   analysis_flags &= ~idc.AF_IMMOFF

   # turn off "automatically make offset" heuristic

   idc.SetShortPrm(idc.INF_START_AF, analysis_flags)

   idaapi.autoWait()

   cfgs = get_func_cfgs_c(FirstSeg())

   binary_name = idc.GetInputFile() + '.ida'

   fullpath = os.path.join(path, binary_name)

   pickle.dump(cfgs, open(fullpath,'w'))

   print binary_name

   idc.Exit(0)

这是最终提取出的100个ACFG:

在提取ACFG的时候,第81个文件无法正常进行,对其单独进行提取的时候,会弹出如下警告:

采用64位的IDA后,可以成功实现提取。

至此,ACFG的提取过程结束,对Gemini复现的初步探索得以实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值