type
status
date
slug
summary
tags
category
icon
password
什么是随机控制流
- 随机控制流是虚假控制流的一种变体,随机控制流通过克隆基本块,以及添加随机跳转(随机跳转到两个功能相同的基本块中的一个)来混淆控制流。
- 与虚假控制流不同,随机控制流中不存在不可达基本块和不透明谓词,因此用于去除虚假控制流的手段(消除不透明谓词、符号执行获得不可达基本块后去除)均失效。
- 随机控制流的控制流图与虚假控制流类似,都呈长条形
随机控制流混淆效果
- 随机的跳转和冗余的不可达基本块导致了大量垃圾代码,严重干扰了攻击者的分析
- 并且 rdrand 指令可以干扰某些符号执行引擎(如 angr)的分析
随机控制流混淆原理
- 随机控制流同样是以基本块为单位进行混淆的,每个基本块要经过分裂、克隆、构造随机跳转和构造虚假随机跳转四个操作 如图所示
随机控制流实现
实现步骤
一共分为四步
- 基本块拆分
- 基本块克隆
- 构造随机跳转
- 构造虚假随机跳转
基本块拆分
- 通过 getFirstNonPHI 函数获取第一个不是 PHINode 的指令,以该指令为界限进行分割,得到 entryBB 和 bodyBB
- 以 bodyBB 的终结指令为界限进行分割,最终得到头部、中部和尾部三个基本块,也就是 entryBB, bodyBB 和 endBB 和虚假控制流几乎一样
基本块克隆
- 将中间的基本块进行克隆,这里可以选择对基本块进行变异,但不能改变基本块的功能。(与虚假控制流不同)
- 与虚假控制流不同,随机控制流在克隆时还需要修复逃逸变量。
逃逸变量引发的问题
- 在一个基本块中定义的变量,如果在另一个基本块中被引用,那么该变量称为逃逸变量
构造随机跳转
- 将生成随机数的指令插入到 entryBB ,将生成的随机数命名为 randVar,并在 entryBB 后插入基于 randVar 的随机跳转指令。 如图所示
插入生成随机数指令和随机跳转
- 向 entryBB 中插入生成随机数的指令和随机跳转,使其能够随机跳转到 bodyBB 或者 bodyBB 的克隆块
- 其中随机数指令我们可以使用 LLVM 的内置函数 rdrand ()