控制流平坦化初了解
原理
借助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)安装
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中可以选择要载入的去混淆规则,如去平坦化
1:选中你需要的反混淆规则,我是反ollvm所以选ollvm的
2:start 点击后右边会变成绿色loaded
3:回到需要反混淆的函数,F5大法好
(此处Decompiling需要等一会
同理,点击stop关闭去混淆
(如果安装完出现这种问题
参考
ida插件-d810安装和使用 - 0P1N
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学长的想法,不过大概率不可行,而且工作量巨大)