阅读下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.py
、ref2sink_bof.py
、ref2sink_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()
else: if not in : 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:
pass
|