代码混淆技术系列
代码混淆技术之随机控制流
00 分钟
2022-12-21
2024-11-11
type
status
date
slug
summary
tags
category
icon
password

什么是随机控制流

  • 随机控制流是虚假控制流的一种变体,随机控制流通过克隆基本块,以及添加随机跳转(随机跳转到两个功能相同的基本块中的一个)来混淆控制流。
  • 与虚假控制流不同,随机控制流中不存在不可达基本块和不透明谓词,因此用于去除虚假控制流的手段(消除不透明谓词、符号执行获得不可达基本块后去除)均失效。
  • 随机控制流的控制流图与虚假控制流类似,都呈长条形

随机控制流混淆效果

  • 随机的跳转和冗余的不可达基本块导致了大量垃圾代码,严重干扰了攻击者的分析
  • 并且 rdrand 指令可以干扰某些符号执行引擎(如 angr)的分析

随机控制流混淆原理

  • 随机控制流同样是以基本块为单位进行混淆的,每个基本块要经过分裂、克隆、构造随机跳转和构造虚假随机跳转四个操作 如图所示
    • notion image

随机控制流实现

实现步骤

一共分为四步
  1. 基本块拆分
  1. 基本块克隆
  1. 构造随机跳转
  1. 构造虚假随机跳转

基本块拆分

  • 通过 getFirstNonPHI 函数获取第一个不是 PHINode 的指令,以该指令为界限进行分割,得到 entryBB 和 bodyBB
  • 以 bodyBB 的终结指令为界限进行分割,最终得到头部、中部和尾部三个基本块,也就是 entryBB, bodyBB 和 endBB 和虚假控制流几乎一样

基本块克隆

  • 将中间的基本块进行克隆,这里可以选择对基本块进行变异,但不能改变基本块的功能。(与虚假控制流不同)
  • 与虚假控制流不同,随机控制流在克隆时还需要修复逃逸变量。
    • notion image

逃逸变量引发的问题

  • 在一个基本块中定义的变量,如果在另一个基本块中被引用,那么该变量称为逃逸变量
    • notion image

构造随机跳转

  • 将生成随机数的指令插入到 entryBB ,将生成的随机数命名为 randVar,并在 entryBB 后插入基于 randVar 的随机跳转指令。 如图所示
    • notion image

插入生成随机数指令和随机跳转

  • 向 entryBB 中插入生成随机数的指令和随机跳转,使其能够随机跳转到 bodyBB 或者 bodyBB 的克隆块
  • 其中随机数指令我们可以使用 LLVM 的内置函数 rdrand ()

构造虚假随机跳转

上一篇
代码混淆技术之常量替换
下一篇
代码混淆技术之指令替换