阅读下SaTC的源码。
工作链接

主要关注src目录下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
src
|-front_anaylysise
|-headless: ghidra脚本,用于提取sink函数等信息
| |-call2sink.py
| |-ref2share.py
| |-ref2sink_bof.py
| |-ref2sink_cmdi.py
| |-share2sink.py
| |-main.py
|-jsparse
|-taint_check: 基于angr、KARONTE工具的代码
| |-taint_analysis
| |-coretaint.py: 污点分析主要逻辑
|-main.py

TODO: 前端分析

Ghidra静态分析

逻辑主要在headless目录下,根据定义好的sink点分为ref2share.pyref2sink_bof.pyref2sink_cmdi.py等多种类型(这里三个文件中存在冗余,有重构空间),寻找从source到sink点的函数调用路径

污点分析

使用符号化执行来进行污点分析

关键数据对象:CoreTaint
关键函数:flat_explore

  • 符号化执行,
  • 污点传播逻辑:如果函数调用存在返回值,则只污染返回值;否则污染全部的参数

污点传播相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def flat_explore()
...
...
if self.get_state(next_path).history.jumpkind == 'Ijk_Call' and ...
if not self.is_summarized():
if not self._follow_call() # 检查是否需要跟入函数,即是否存在污点相关操作




# ret

else:
if not in : # 检查函数是否在followTarget集合中,以及self._p.loader.main_object.plt.values
for i in xrange(nargs):
val_arg = getattr(self.get_state(next_path).regs, name)
if self.is_or_points_to_tainted_data(val_arg, next_path)
if (...):
"return something, only taint r0"
else:
"taint all writable args"
cfg = getBugFindingCFG()???
else:

# check memset

pass