# slice_joern **Repository Path**: wangcaicai1/slice_joern ## Basic Information - **Project Name**: slice_joern - **Description**: 源代码上使用joern提取切片到sink位置 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-09 - **Last Updated**: 2023-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 创建环境 拉取docker镜像: ``` docker push wangnono000/get_sink:2.0 ``` 克隆仓库到本地 ``` git clone https://gitee.com/wangcaicai1/slice_joern.git ``` 创建docker镜像,将仓库目录映射为容器目录 ``` docker run -itd --name=[容器名称] -v [本地项目地址]:/home/slices_main 【镜像名称】 /bin/bash docker run -itd --name=slices_wkx -v /home/wkx/slice_joern:/home/slices_main wangnono000/get_sink:2.0 /bin/bash ``` ## 运行项目 进入docker容器 ``` docker start [容器名称] docker exec -it [容器名称] /bin/bash ``` 整体目录结构介绍: ``` data:存放待切片的数据 data2slice:切片代码 slice_all:切片结果 data和slice_all 下面都有一个0/目录,这个是为了如果待切片的数据多,将待切片的数据划分成几个子集,比如0,1,2三个,则需要在这两个目录下分别创建对应的子目录 0/ 1/ 2/ 之后在运行脚本时添加对应的分支就可以开多个docker进行切片,提高效率 ``` 对应的切片代码说明 ``` (1) cv_extract.py:静态分析全部的diff文件内容,提取赋值、函数调用、变量和函数声明以及条件语句,以软件为单位保存在对应的文件夹下,文件内容以函数为单位记录diff node信息作为切片的起点。 (2) old和new文件分别进行处理,可分软件处理: l  生成CFG、PDG和CG,存在的问题是在提取函数调用关系时以函数名为依据,在同一CVE下存在多版本文件时,常常有函数重名(内容也相同)的现象,导致提取的切片有重复。 l  get_diff_node.py:需要修改old/new参数,依赖于从diff文件静态分析出的diff_node.pkl文件在neo4j数据库中查询diff节点信息,对于old文件和new文件分别生成diff_points_old.pkl和diff_points_new.pkl。 l  get_slices.py:提取切片,需要修改old/new参数,生成的切片文件以漏洞文件为单位保存,修复前和修复后的切片分别保存在xxx_old.txt和xxx_new.txt文件中。 (3) complete_slices.py:使用diff信息和修复前后的切片生成互补切片,即在diff中没有提取出有效减号行的(只有加号行),将修复后的切片删除这些减号行的内容作为修复前的切片,没有加号行的做同样的处理。 (4) sort_slices.py:以软件为单位整理切片,需要修改old/new参数,将同一软件下的所有old切片全部保存在slices_old.txt文件中,所有new切片全部保存在slices_new.txt文件中。 (5) match_sink.py:需要修改old/new参数,假设diff修改的不是sink代码行,那么sink行依然存在于修复后的切片中,对于slices_old.txt和slices_new.txt分别提取source和sink信息,保存切片最前端的source和最远端的sink用于切片截断,保存所有可能的sink信息用于打标签。 (6) cut_slices.py:需要修改old/new参数,分别对修复前和修复后切片进行截断,再次进行去重,以软件为单位将其所有切片保存在slices.txt文件中。 (7) make_label.py:生成切片的0/1标签和关注行标签,关注的行为diff node和匹配到的所有可能的sink代码行。 (8) slice_commit.sh :运行整个切片的脚本 ``` 1. 首先将待测项目放入到data目录下 `data/0/software/cve_id/xxxx.diff xxx_OLD.c xxxx_NEW.c` 2. 进入到`/data2slice`目录执行 `./slice_sommit.sh s 0 ` s表示切片 0表示之前拆分数据的子集编号 3. 最终在`slice_all/0/软件名/CVEID/slice/result/` 目录下就可以看到最终的切片结果和label.pkl文件 4. 如果没有切片文件,可以看`slice_all/0/软件名/CVEID/slice/logs/error.txt` 查看出错步骤。偶尔有一两个没有提出切片很正常,如果连续看了好几个都没有切片,则需要查看一下原因