简介
虚假控制流(BCF, Bogus Control Flow),该方法通过在当前基本块之前添加一个基本块来修改函数调用图。这个新的基本块包含一个不透明谓词,然后进行条件跳转到原始基本块。并且原始基本块也被克隆,并填充了随机选择的垃圾指令。(This method modifies a function call graph by adding a basic block before the current basic block. This new basic block contains an opaque predicate and then makes a conditional jump to the original basic block.The original basic block is also cloned and filled up with junk instructions chosen at random.)详见官方解释1
原理
一句话总结 构造虚假基本块,通过不透明谓词进行条件跳转到真实基本块
- 不透明谓词原理: 利用全局变量来构造条件表达式以制造虚假控制流,因为这个全局变量不会有写入的地方,所以这个表达式即一条结果恒定的条件表达式,因此始终只会走向一个真实分支,而另外的虚假分支即一个永不到达的分支.
- 条件跳转: 通过大量的
if-esle
进行条件跳转(识别BCF的标志)
反混淆思路
- 永不到达的虚假基本块应该被死代码消除(DCE, Dead Code Elimination),而IDA-HexRays本身具备DCE,只是IDA无法识别全局变量是否会改变,而原理上不透明谓词的全局变量是不会改变的,因此只要将这个全局变量改为只读,IDA就能自动进行DCE,从而消除BCF。
- 利用符号执行
实战
- 思路一反混淆
- 识别出BCF,可以通过识别条件判断的地方是否是一个恒等式
- 修改全局变量为可读
备注: 注意data段是否会影响其他,如果会影响的话,可以通过Patch到其他段中(可看参考文章),这里将write勾选去掉重新F5即可。
参考
参考BCF官方解释: Description ↩︎