控制流平坦化学习(转载)
控制流平坦化初了解(持续更新)
原理
借助 LLVM(一个底层虚拟机项目,我目前不理解虚拟机这个概念)这个项目,目前理解为类似于一个编译器的东西,把源码通过各式各样的复杂的语义分析翻译成另一个玩意.
但原本是拿来优化的,然后做安全的人拿来改为混淆,就是 OLLVM 项目,做安全不得好死 😡.
控制流平坦化(control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程
添加控制流平坦化
build/bin/clang check_passwd.c -o check_passwd_flat -mllvm -fla
经过控制流平坦化后的执行流程就如下图
这样可以模糊基本块之间的前后关系,增加程序分析的难度,同时这个流程也很像 VM 的执行流程
平坦化程序特征
- 函数的开始地址为序言的地址
- 序言的后继为主分发器
- 后继为主分发器的块为预处理器
- 后继为预处理器的块为真实块
- 无后继的块为 retn 块
- 剩下的为无用块
解决方法
两种:
- D810 脚本
- deflat
D810
D-810 是一个基于 IDA Microcode 实现的可拓展的 ida 去混淆插件,尤其是在 CTF 中碰到控制流平坦化时可以使用默认的脚本 F5 一键去平坦化。
1)安装
把文件夹和.py 复制到 IDA 目录的 plugin 下即可
(另外建议安装 Z3 以便能够使用 D-810 的几个功能
pip install z3-solver
2)使用
启动 IDA
在 Edit->plugins-D-810 或 快捷键 CTRL+shift+D 启动 D810
在 Current file loaded 中可以选择要载入的去混淆规则,如去平坦化
1:选中你需要的反混淆规则,我是反 ollvm 所以选 ollvm 的
2:start 点击后右边会变成绿色 loaded
3:回到需要反混淆的函数,F5 大法好
(此处 Decompiling 需要等一会
同理,点击 stop 关闭去混淆
(如果安装完出现这种问题
参考
https://github.com/igogo-x86/HexRaysPyTools/issues/48
重新安装 sip.pyd 即可
deflat
法二:使用基于 angr 的脚本 deflat.py 去除控制流平坦化
安装
- 首先安装 angr 库
Windows + R 输入 cmd
pip install angr
- 脚本 github 地址deflat: use angr to deobfuscation
把am_graph.py
与 deflat.py 放在同一目录下
所在目录下打开 cmd 命令行输入
python + deflat.py + 文件名 + 起始地址(基本就是main函数的地址)
#python deflat.py hardCpp 0x4007E0
关键之处在于寻找程序的 address
注意到“函数的开始地址为序言的地址”,因此我们需要在序言中找函数起始位置
期间可能会出现大量类似警告:
没事,只要最后是这样就好:
得到一个已成功去平坦化的 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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)