首页
社区
课程
招聘
[原创]OLLVM-deflat 脚本学习
发表于: 2023-4-9 18:23 21413

[原创]OLLVM-deflat 脚本学习

2023-4-9 18:23
21413

deflat脚本链接:GitHub - cq674350529/deflat: use angr to deobfuscation

这里以代码混淆与反混淆学习-第一弹中的OLLVM 混淆样本为例进行去除。【LLVM-4.0】

python deflat.py --file main-bcf --addr 0x401180

deflat.py 成功去除后效果:

去混淆后,效果还算可以,能分析程序流程了。

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

angr documentation

利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)

如第一弹中分析:OLLVM 的控制流平坦化是将程序的一般逻辑划分为很多个真实执行的块,然后通过分发器进行链接。其实就是一个Switch结构,每次执行完真实块后,进行预处理,再跳转到主分发器,继续分发,最终达到平坦化的效果。

显然,去控制流平坦化就是要找到真实块间的跳转逻辑,打破Switch结构束缚。

具体来说,有如下步骤:

首先明确:【以下结论针对OLLVM项目,其他大佬加料的OLLVM混淆还需要单独分析】

angr 获取类似Ida的 CFG

获取真实块、主分发器、预处理器、序言、retn块和无用块


获取真实块的细节

利用angr 强大的符号执行功能,找到各真实块的连接逻辑。

这里对于两个分支的模拟执行,只需关注cmov指令,就可以分别对应得到eax、ecx,然后获得后续真实块。【局限性很大】

符号执行 symbolic_execution()函数,返回后继真实块。

如此便完成了 deflat脚本的简单处理分析。

分析下来,其实就是定位到所有真实块,然后利用angr符号执行将真实块间的执行逻辑进行串联。最后进行patch程序,重建控制流。

但显然存在一些问题,我们默认了如下规则:

但是在实际去除控制流平坦化过程中,上面的默认思路已经被加混淆的开发者做了处理。

例如:

这也导致了,这个deflat脚本的普适性较低,除了能够处理OLLVM官方项目做的混淆,对加了其他PASS或者处理的混淆,基本用不了。

所以对于去除不了的OLLVM混淆,我们需要根据程序的实际混淆效果,对deflat脚本进行修改,再进行去混淆。

【这也要求对deflat 脚本比较熟悉,可以更快上手】

使用代码混淆与反混淆学习-第一弹中加了花指令的程序,进行OLLVM控制流平坦化混淆,看看效果。

源代码如下:

存在较大的问题,我的OLLVM 环境是在Ubuntu上搭建的,对于上述内联汇编加的花指令无法编译通过!

【或许可以在Windows 上移植OLLVM,进行编译(好像挺难的)

可以看到,花指令用到的标签、$ 出现报错。

【最终也没解决编译问题,或许本就不可以,ollvm 不具备这样的处理能力,也可能是我代码的问题,如果博客前的你有任何想法,欢迎与我交流

TSCTF-J 2022 WP

upx_revenge题目进行分析。

首先直接使用deflat 脚本。

python deflat.py --file upx_revenge_test --addr 0x4016D0

发现没有找到retn 块。

回到ida 查看cfg 图发现原因:存在其他的退出块。

这里需要改进deflat 脚本,使其存在很多retn块。

成功运行,但是去除效果不行。

很明显看出,程序的真实块间的逻辑串联失败,也就是重建控制流失败。

产生原因

显然,这里存在2个分支,因为有两个cmov【相同判断】,并且call 函数,对分支跳转是有作用的,这里var_CC是顺序执行,动态更新的。

【deflat 脚本只处理了执行有一个cmov指令的情况,且hook了call函数】

【由于var_CC是顺序执行,动态更新也可以看出,deflat 脚本的模拟执行思路已经无法对真实块的后继进行确定了】

但这里做个测试,不hook call 看是什么效果。

可以知道,取消hook call 对真实块后继的查找毫无影响,这是因为deflat中的模拟执行,只是基于comv 处的模拟。对前文并无任何关联。

显然,该deflat脚本的无法处理了。【】

upx_revenge 这道题而言,

deflat 脚本中angr 对局部的模拟执行显然无法获取真实块间的执行顺序,重建控制流显然也无从谈起。当然静态查找各个控制流平坦化的功能块效果还是可以的。

那么如何通过angr,有序的、联系上文地进行模拟执行,获取真实块的执行逻辑,显然是关键点!

【??? 后续学习了,有思路再更新】

[原创]ARM64 OLLVM反混淆-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com (kanxue.com)

Unicorn反混淆:恢复被OLLVM保护的程序(一) - 简书 (jianshu.com)

使用unicorn 模拟执行框架获取真实块间的执行顺序,重建控制流。

【还没学过 unicorn 使用,,,】

使用IDA microcode去除ollvm混淆(上) - 先知社区 (aliyun.com)

GitHub - PShocker/de-ollvm: IDA Python Script for anti ollvm

利用ida 现成的CFG 图,以及idc 脚本,动态运行程序,获取真实块的执行顺序,从而恢复控制流。

控制流平坦前 控制流平坦后
 
 
 
 
 
 
 
 
 
 
 
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 12
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  orz1ruo   +5.00 2023/04/14 感谢分享~
最新回复 (8)
雪    币: 26245
活跃值: (63287)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2023-4-9 19:13
0
雪    币: 4460
活跃值: (6706)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好文章,正准备进阶ollvm,学习了
2023-4-10 10:55
0
雪    币: 1671
活跃值: (215832)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
tql
2023-4-10 11:10
0
雪    币: 26
活跃值: (1310)
能力值: ( LV3,RANK:26 )
在线值:
发帖
回帖
粉丝
5

upx_revenge 是北邮的题啊, 那我估计这个混淆就是R1mao 大佬开源出来的那个。
https://bbs.kanxue.com/thread-275296.htm  之前也研究过这个,是用unicorn 去混淆的

最后于 2023-4-10 14:36 被1mmortal编辑 ,原因:
2023-4-10 14:31
0
雪    币: 177
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1mmortal upx_revenge 是北邮的题啊, 那我估计这个混淆就是R1mao 大佬开源出来的那个。https://bbs.kanxue.com/thre ...
是的,和祥云杯那个babyparser差不多。学长也给我推荐了你的处理思路,很顶。接下来准备先学习一下unicorn,然后采用你博客的思路复现一下!大佬tql
2023-4-10 14:51
0
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2023-4-12 08:59
1
雪    币: 545
活跃值: (1502)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏!
2023-5-4 19:30
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
所有的程序流程图不是应该只有两种分支嘛(1 or 0),大佬说的三种可以列举下情况吗?我最近也在研究unicorn获取程序执行路径,被模拟路径算法卡住了
2023-10-25 10:59
0
游客
登录 | 注册 方可回帖
返回
//