作者论坛账号:小远zi
llux
ollvm de-obfuscator
移除ollvm中的控制流平坦化、不透明谓词
ll
取自ollvm
,ux
取自lux
,寓意混淆之中的光亮和线索
Description
* 实现了在
x86_64架构下
,开启代码优化后
,控制流平坦化
以及不透明谓词
的移除* 实现原理
不同于符号执行
,无需条件约束,在遇到BCF增加的死循环块的时候,依然可以完成路径遍历* 针对ollvm进行了充分地优化,速度对于符号执行框架angr速度较快,且可以处理复杂样本
* 暂未开源,因为这样会使得混淆对抗太过于简单,这里只提供了工具方便使用
Usage 1
我们有如下代码,使用函数注解的形式开启了ollvm的全部的混淆功能,使用较低的bcf概率
-mllvm -bcf_prob=3
,在开启较高概率时,可以对部分条件进行手动patch,最终在程序运行结束之后会提示一些无法到达的基本块,手动删除即可,参考Usage 3
* fla:控制流平坦化
* sub:指令替换
* split:基本块拆分
* bcf:伪造控制流
编译后的CFG(控制流程图)
在要去除混淆的函数入口下断(硬件断点),并运行到
dump堆栈内存
dump模块内存
编写subroutine.txt
将dump的内存和subroutine.txt按如下方式布局
程序在短暂运行后会在当前路径下生成code.asm
拿到vs进行编译
经过对代码进行一定的修改,使得其可以通过编译(修改后的代码上传到了Release)
观察到不透明谓词
其中是dword_14001DA48,dword_14001DA4C分别是ollvm bcf功能中的int类型的全局变量x和y,地址连续,值恒为0
复制代码 隐藏代码mov eax,dword_14001DA48
手动修改成如下代码化简逻辑
mov eax,0
复制代码 隐藏代码cmp dword_14001DA4C, 0ah
cmovl eax, r13d
手动修改成如下代码化简逻辑
;cmp dword_14001DA4C, 0ah
mov eax, r13d
复制代码 隐藏代码mov eax, 0ff85a711h
mov ecx, 4ef55c6dh
cmovl eax, ecx
;jmp 1400012f0h
cmp eax,0ff85a711h
je loc_1400013a1
jmp loc_140001459
手动修改为如下代码化简逻辑
;mov eax, 0ff85a711h
;mov ecx, 4ef55c6dh
;cmovl eax, ecx
;jmp 1400012f0h
;cmp eax,0ff85a711h
jl loc_140001459
jmp loc_1400013a1
按照上述的方法对代码进行一些调整,得到:
使用函数返回值对比验证逻辑的正确性,通过
我们在基于
angr
框架的deflat.py
了进行了测试,结果是失败的
Usage 2 multi-dispatcher
按照上述操作,我们同样地实现了更加复杂且拥有多个分发器样本的去混淆
编译后的CFG(控制流程图)
短暂运行后,我们过滤掉了无法到达的基本块140001cd7、1400025c5(这里是程序逻辑本身就不可达,并不是BCF,因为我们没有进行patch)
诸如此类的逻辑会出现不可能到达的基本块,这是因为ollvm的混淆pass会优先于llvm的优化pass
手动删除未到达的基本块140001cd7、1400025c5
手动删除死循环块
手动删除死循环块的引用
按照上述的方法对代码进行一些调整,得到:
使用函数返回值对比验证逻辑的正确性,通过
Usage 3 bcf patch
我们将
Usage 1
中的代码使用默认的bcf
概率-mllvm -bcf_prob=30
进行编译,相较于-mllvm -bcf_prob=3
的概率明显复杂了一些。我们需要寻找类似箭头所指的bcf块
,特点是有多个前驱,后继为分发器,这种情况是因为编译优化造成的
bcf块
内容如下,一般情况两个cmov
都是条件都是满足的,可以看做mov
所以逐一对
bcf块
的所有前驱进行简单的patch
操作
对
bcf
块进行nop
操作
按照
Usage 1
中演示的方法进行操作。llux
对一些基本块进行了合并,并提示了无法到达的基本块
手动删除因为基本块合并导致重定义的符号
并按照之前的方法对代码进行一定的调整,最终得到
使用函数返回值对比验证逻辑的正确性,通过
Reference
-
deflat
-
PLCT实验室维护的ollvm分支
-
利用符号执行去除控制流平坦化
-
Deobfuscation: recovering an OLLVM-protected program
Github
https://github.com/llxiaoyuan/llux
--官方论坛
www.52pojie.cn
--推荐给朋友
公众微信号:吾爱破解论坛
或搜微信号:pojie_52
本文始发于微信公众号(吾爱破解论坛):【原创】移除ollvm中的控制流平坦化、不透明谓词
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论