控制流平坦化学习(转载)

控制流平坦化初了解(持续更新)

原理

借助 LLVM(一个底层虚拟机项目,我目前不理解虚拟机这个概念)这个项目,目前理解为类似于一个编译器的东西,把源码通过各式各样的复杂的语义分析翻译成另一个玩意.

但原本是拿来优化的,然后做安全的人拿来改为混淆,就是 OLLVM 项目,做安全不得好死 😡.

控制流平坦化(control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程img

添加控制流平坦化

build/bin/clang check_passwd.c -o check_passwd_flat -mllvm -fla

经过控制流平坦化后的执行流程就如下图img

这样可以模糊基本块之间的前后关系,增加程序分析的难度,同时这个流程也很像 VM 的执行流程

平坦化程序特征

img

  1. 函数的开始地址为序言的地址
  2. 序言的后继为主分发器
  3. 后继为主分发器的块为预处理器
  4. 后继为预处理器的块为真实块
  5. 无后继的块为 retn 块
  6. 剩下的为无用块

解决方法

两种:

  • D810 脚本
  • deflat

D810

D-810 是一个基于 IDA Microcode 实现的可拓展的 ida 去混淆插件,尤其是在 CTF 中碰到控制流平坦化时可以使用默认的脚本 F5 一键去平坦化。

1)安装

GitHub - zhkl0228/d810: D-810 is an IDA Pro plugin which can be used to deobfuscate code at decompilation time by modifying IDA Pro microcode.

把文件夹和.py 复制到 IDA 目录的 plugin 下即可

(另外建议安装 Z3 以便能够使用 D-810 的几个功能

pip install z3-solver

2)使用

启动 IDA

在 Edit->plugins-D-810 或 快捷键 CTRL+shift+D 启动 D810

在 Current file loaded 中可以选择要载入的去混淆规则,如去平坦化

img

1:选中你需要的反混淆规则,我是反 ollvm 所以选 ollvm 的

2:start 点击后右边会变成绿色 loaded

3:回到需要反混淆的函数,F5 大法好

(此处 Decompiling 需要等一会

同理,点击 stop 关闭去混淆

(如果安装完出现这种问题img

参考

ida 插件-d810 安装和使用 - 0P1N

https://github.com/igogo-x86/HexRaysPyTools/issues/48

重新安装 sip.pyd 即可

deflat

法二:使用基于 angr 的脚本 deflat.py 去除控制流平坦化

安装

  1. 首先安装 angr 库

Windows + R 输入 cmd

pip install angr
  1. 脚本 github 地址deflat: use angr to deobfuscation

把am_graph.py 与 deflat.py 放在同一目录下

所在目录下打开 cmd 命令行输入

 python + deflat.py + 文件名 + 起始地址(基本就是main函数的地址)
 #python deflat.py hardCpp 0x4007E0

关键之处在于寻找程序的 address

注意到“函数的开始地址为序言的地址”,因此我们需要在序言中找函数起始位置img

期间可能会出现大量类似警告:img

没事,只要最后是这样就好:img

img得到一个已成功去平坦化的 recovered 新文件,用这个文件继续分析

参考

反混淆器:D810 的安装和使用 #ollvm 去平坦化 #D-810 - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

[OLLVM 与去平坦化 & RoarCTF2019] polyre 详细 WP - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

利用符号执行去除控制流平坦化 - 博客 - 腾讯安全应急响应中心


参考

【RE】去 OLLVM 的平坦化_d810 插件-CSDN 博客 基本来自这篇文章


一些可以继续学习的思路:

  • 了解如何魔改平坦化
  • 魔改 deflat 为全部识别(Errmis 学长的想法,不过大概率不可行,而且工作量巨大)
  • 动调的做法,可以看有用的代码块跟踪,利用F4.
posted @   T0fV404  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示