• 4、SySeVR复现——Generating slices


    目录

    1、准备阶段

    2、生成实验数据的CFG图

    3、生成实验数据的PDG图

    4、生成实验数据的调用图

    5、获取四种类型的SyVCs

    6、提取SeVCs

    7、获取漏洞的代码行号

    8、给切片打标签

    9、将标签写入切片


    1、准备阶段

            实验数据我只用这些:

            (1)NVD

            (2)NVD_diff

            将实验数据放在/home/test/source2slice目录下

             删除.joernIndex文件

             将实验数据导入joern

            开启neo4j数据库

    2、生成实验数据的CFG图

    1. mkdir cfg_db
    2. python2 get_cfg_relation.py

             运行文件的结果:

            (1)会针对NVD中的每个实验数据,都会生成相应的文件夹;

             (2)每一个文件夹下,有三个pkl文件,分别为cfg.pkl、dict_cfgnode2if.pkl、dict_if2cfgnode.pkl

             cfg.pkl中保存的是函数CFG图的边,另外两个文件目前不清楚作用。

     

    3、生成实验数据的PDG图

    1. mkdir pdg_db
    2. python2 complete_PDG.py

             运行结果:
            (1)会生成每个实验数据对应的pkl文件

             (2)以第一个pkl文件为例,可以看到文件中包含的是pdg图相应的边信息。

             另外,以10这个节点为例,其实pkl文件中的边是经过选择了的,也就是说neo4j数据库中保存着程序的PDG图,但是有一些冗余的信息需要处理。

    4、生成实验数据的调用图

    1. mkdir dict_call2cfgNodeID_funcID
    2. python2 access_db_operate.py

             运行结果:

            (1)生成一个dict.pkl文件

             (2)打开该pkl文件

             这里打开文件,里面没东西,可能是文件数太少,没有调用关系,这里还有待深究。

    5、获取四种类型的SyVCs

    python2 points_get.py

             运行结果:

            (1)在source2slice目录下生成四种SyVCs相对应得pkl文件:

    • sensifunc_slice_points.pkl
    • pointuse_slice_points.pkl
    • arrayuse_slice_points.pkl
    • integeroverflow_slice_points_new.pkl

            (2)查看文件里是啥

            1)sensifunc_slice_points.pkl

            以sensifunc_slice_points.pkl文件为例,里面保存的是符号函数调用漏洞的一些危险函数,以及其在图数据库中的信息。

            以(['100'],'86','strcpy')为例,100是strcmp所在语句节点的编号,86是strcmp所在的函数的编号。

     

            其余三个文件中得内容,也差不多。

            2)pointuse_slice_points.pkl

     

             3)arrayuse_slice_points.pkl

            4)integeroverflow_slice_points_new.pkl

    6、提取SeVCs

    1. mkdir -pv C/test_data/4
    2. python2 extract_df.py

             运行结果:

            (1)生成四种漏洞类型对应的SeVCs

             (2)以api_alices.txt为例,打开该文件:

             以strcpy为例,可以看到,生成了strcpy的切片,并且每一句后面都表明了该行代码在文件中的行数。

    7、获取漏洞的代码行号

            首先,dealfile.py文件需要做以下修改:

    python2 dealfile.py

            运行结果:

            (1)在source2slice文件下,会生成一个vul_context_func.pkl文件;

             (2)这个文件里保存:通过对比diff文件,以论文中提到的漏洞认定标准,找到有漏洞的文件中危险语句的行数。

            以CVE_2004_1151_PATCHED_sys32_ni_syscall.c文件为例:

            对应的diff文件,保存了CVE_2004_1151_PATCHED_sys32_ni_syscall.c的危险语句,即第4、5、6、7、8行语句。

             生成的vul_context_func.pkl中,保存的就是这些危险语句在原文件中的位置。

     

    8、给切片打标签

            对源文件做以下更改:

            (1)修改路径:切片文件、标签文件以及vul_context_func.pkl文件

             (2)获取key的时候,如下图一样更改。

    python2 make_label_nvd.py

            运行结果:

            (1)在./C/label_data/目录下,生成四种SyVCs对应的标签文件

            (2)以api_slices_label.pkl文件为例,可以看到文件中对每一个切片文件都做了标签,0代表该切片没有漏洞;1代表该切片有漏洞。

    9、将标签写入切片

            对原文件做以下修改:

    python2 data_preprocess.py

             运行结果:

            (1)在./slice_label文件下,产生了四种SyVCs对应的txt文件,其实这四个文件就是李珍老师github上给的四个txt文件。

            (2)查看标签是否与李珍老师给的一样,这里仅以一个被标记为0的api切片和一个被标记为1的api切片为例:

            1)标记为0的api切片

            2)标记为1的api切片

     

            综上,生成了四种SyVCs切片文件,且都打了标签。下一步将进行切片的向量化。

  • 相关阅读:
    【FLASH存储器系列八】ONFI数据接口详述之一
    java-初识WEB:HTTP
    08 相合估计
    【深入浅出 Yarn 架构与实现】2-3 Yarn 基础库 - 服务库与事件库
    nginx初识
    Python Requets库学习总结
    合并二叉树(力扣617)
    数量关系(刘文超)
    Apollo学习笔记(28)贝叶斯滤波
    Sentinel服务熔断和流控
  • 原文地址:https://blog.csdn.net/qq_55202378/article/details/127973104