首页
社区
课程
招聘
91
[原创]OLLVM控制流平坦化混淆还原
发表于: 5天前 4891

[原创]OLLVM控制流平坦化混淆还原

5天前
4891

最近在研究ollvm反混淆,刚好遇到此样本,借此文章对ollvm fla控制流平坦化进行一个反混淆分析,顺便分享下idapython相关api的知识。

娜迦加固 libgeiri.so

函数:init_proc

ida7.7

pycharm:编写idapython代码,需要从ida安装目录下导入相关的库

图片描述

下面是一个标准的平坦化cfg图,经过ollvm fla混淆后几行的代码代码最后会膨胀至上百行。这里每个矩形图都叫做基本块,在这个图里我们主要关心序言块、return块和真实块。只有这三类的基本块才是我们需要的。其他的都是ollvm混淆加上的,这里统称虚假块。

图片描述

基本块:由多行指令组成,一般最后一条指令以跳转指令或ret结尾

主分发器:类似switch-case 结构,通过传入的状态变量,并决定跳转至目标块。

预处理器:我们可以抽象认为汇集在预处理器的基本块均为真实块

以下可以帮我们了解块与块之间的关系

这里我画个图概述下什么是前驱和后继,这两个名词也是用得比较多的。

注意看箭头指向,可以看到下面的执行流程是由AB再到C,那么这里B就是中间块

因为AB的上一个基本块那么A就是B的前驱

因为CB的下一个基本块,那么C就是B的后继

图片描述

上面简要说了下ollvm混淆的相关知识,那么我们应该如何去反混淆呢。这里只需要记住一个核心观念:找真实块(序言块、汇集到预处理器的所有块、return块)。找到所有真实块后,还需要做的是理清块与块之间的链接关系,最后需要做的工作就是根据块与块之间的关系,修改块的跳转指令patch到对应的块。这样就实现了平坦化的反混淆。

ida打开so,进入到init_proc函数

图片描述

F5进入伪代码

图片描述

流程混乱,无法直观的去分析。

根据上面反混淆的理念,我们来理一理这个混淆的相关结构

序言块:0x43058

图片描述

主分发器:0x43120

图片描述

通过这个主分发器块,调用block.preds()函数,我们可以得到主分发器块的所有前驱块,也就是真实块

return块:0x43500

图片描述

到此,序言块汇集到主分发器的所有块,return块这三大类的所有块我们都找到了,那我们就可以反混淆了吗。当然不是,我们只是收集到了所有块,但是还不知道块与块之间的跳转关系,所以我们还需要理清块跳转关系。

图片描述

我们先点击主分发器的地址,可以看到ida识别到所有引用该地址的基本块,这里提一嘴,"后继为预处理器的块为真实块"等上文6点理论都是广义上的,我们可以那样去认为,但是还是会有个别的情况与这6点相驳。

图片描述

比如这个基本块它的后继也是主分发器(这里的函数没有预处理器,而是真实块直接连接主分发器),难道它就是真实块吗,当然不是,这里它知识重置了状态变量w8,以供下一个switch跳转,从汇编中可以看出其中并没有任何的真实块逻辑。

图片描述

接着看这里的 B.NE loc_43120

w8,w9不相等走向主分发器,否则走向下面的基本块,我们也可以看到下一个基本块的最后一条指令也是直接跳转到主分发器的,所以总结出B.NE这个连接到主分发器的块不是真实块,只是一个重置switch跳转状态变量的块。所以我们只需要关注汇集到主分发的块的同时,最后一条指令还得是B指令。

好了,主分发器的前驱块分析完了,我们接着去理清跳转关系

这里我以0x43490基本块为参照物,逻辑都是一样的。

这里的MOV W8, #0x39649A15命令是重置状态变量,当我们循环到switch的时候,会匹配当前w8的值,对应上值时就跳转到相应的位置,所以可知0x39649A15是当前基本块的后继。但是这个后继我们目前只知道索引,我们是不是还得知道索引所代表的基本块是哪个啊

图片描述

点击0x39649A15,得到这个基本块

W8, W9不相等是跳转到loc_43120主分发器,这个我们不用关心,我们去看另一个走向得到如下图示

图片描述

这个基本块的地址是0x431D8,所以我们是不是得到了0x39649A15索引指向0x431D8基本块的地址了,得到0x43490->0x39649A15,

0x39649A15->0x431D8,换算可得0x43490->0x431D8

图片描述

简单画个图,以0x43490为参照,后继上面说了,这里我们看前驱。可以看到它的前驱存储的索引是0x3455F111,然后查找0x3455F111被谁引用,发现0x43314的后继索引是0x3455F111。跟着这个现象我们可以得知真实块自身存储的索引是后继,前驱存储的索引是此基本块的前驱。

接下来开始写脚本去混淆。

拿到主分发器块的地址,结果正确

图片描述

可以借此查看真实块的相关特征

图片描述

这里先判断真实块的最后一条指令操作符是B,并且操作数也必须是主分发器地址0x43120。然后取每个真实块B指令的上一条指令,根据MOV和MOVK的不同特征去匹配后继索引。

简要说下这种汇编,它的意思是把0x7986左移16位,并且保持低位数据不变,这里低位是上述的w8 = 0xA6F8,1个字节2个字符,1个字节8个比特位,所以一个字符占4个比特位,左移16位后变为0x79860000,再和低位和并就是0x7986A6FB。算术运算符就是w8 =( 0x7986<<16) |0xA6FB。

图片描述

CSEL W8, W24, W8, EQ

注意这种的真实块,命令CSEL,这里是带分支的真实块

真实块的连接要么是顺序连接只有一个后继

要么就是分支连接,有两个后继,也就是if else。

这里样本CSEL都是有4个操作数的,EQ是操作符,当EQ条件满足时把w24赋值给w8,否则把w8赋值给w8。总之不管它的操作符如何变,条件为真时,Z标志位为1,都是取第2个操作数(w24),为假取第3个操作数(w8)

这里我就直接把相关的索引添加进去了,数量少就没去匹配特征了,数量多的话建议特征处理

图片描述

图片描述

粘贴到ida里运行,得到所有真实块的前驱索引和后继索引

图片描述

这里有个疑问就是,怎么保证这些块的连接是不是都正确呢。针对这个我也写了个函数,验证这个对象里的连接是否都是正确

图片描述

图片描述

得到上述的关系调用链,以函数地址开头,以return块结尾,所有存储的真实块调用链执行成功无异常报错,如果其中执行失败会打印以下信息,数组的最后一个元素0x434ac里存储的0xbd9fbba索引没有找到后继块,针对这个报错可以去ida查看对应的信息,或者直接向stamp对象里补0x434ac相关的后继信息。有点类似unidbg的味道,缺啥补啥。

图片描述

最后就是调用此函数去重建块连接

所有流程走完了,现在去ida执行脚本

图片描述

可以看到反混淆后的代码已经能直观看到运行整个代码的运行逻辑了。

loc_43490
ADRP            X8, #off_97FB8@PAGE
LDR             X8, [X8,#off_97FB8@PAGEOFF]
LDR             W8, [X8]
STR             W8, [X19,#0x20]
MOV             W8, #0x39649A15
B               loc_43120
loc_43490

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 91
支持
分享
赞赏记录
参与人
雪币
留言
时间
mb_mzboxhri
为你点赞!
55分钟前
周旋久
感谢你的积极参与,期待更多精彩内容!
3小时前
zhuzhu_biu
感谢你分享这么好的资源!
6小时前
breaklink
谢谢你的细致分析,受益匪浅!
21小时前
kkte
请注意发帖规范,保持良好的讨论环境!
23小时前
yhock
你的分享对大家帮助很大,非常感谢!
23小时前
wx_墨_198
为你点赞!
1天前
Aar0n
非常支持你的观点!
1天前
怜渠客
期待更多优质内容的分享,论坛有你更精彩!
1天前
berkedel
感谢你分享这么好的资源!
2天前
wx_Kiyose
非常支持你的观点!
2天前
L0x1c
感谢你的贡献,论坛因你而更加精彩!
2天前
逆向涉猎
你的分享对大家帮助很大,非常感谢!
2天前
Sinozo
你的分享对大家帮助很大,非常感谢!
2天前
哈哥
感谢你的贡献,论坛因你而更加精彩!
2天前
mb_rveckyle
期待更多优质内容的分享,论坛有你更精彩!
2天前
蓝色之冰
期待更多优质内容的分享,论坛有你更精彩!
2天前
mb_fefksfsl
感谢你分享这么好的资源!
2天前
wwwst
感谢你分享这么好的资源!
2天前
Our_OT
非常支持你的观点!
2天前
mb_ghatfozg
你的分享对大家帮助很大,非常感谢!
2天前
NPC2000
你的帖子非常有用,感谢分享!
2天前
软件君子
你的分享对大家帮助很大,非常感谢!
2天前
wx_Q道长
感谢你的积极参与,期待更多精彩内容!
2天前
userapp
感谢你的贡献,论坛因你而更加精彩!
2天前
wx_Dispa1r
你的帖子非常有用,感谢分享!
3天前
Noe1
谢谢你的细致分析,受益匪浅!
3天前
尸位素餐
这个讨论对我很有帮助,谢谢!
3天前
mb_edtugpxb
谢谢你的细致分析,受益匪浅!
3天前
toy乐
感谢你的积极参与,期待更多精彩内容!
3天前
coderL
为你点赞!
3天前
qqizai
期待更多优质内容的分享,论坛有你更精彩!
3天前
iCookiie
感谢你分享这么好的资源!
3天前
拾海
这个讨论对我很有帮助,谢谢!
3天前
WMBa0
为你点赞!
3天前
无罗
这个讨论对我很有帮助,谢谢!
3天前
zhnnmsl
非常支持你的观点!
3天前
TubituX
这个讨论对我很有帮助,谢谢!
3天前
mb_nymhrhcn
你的分享对大家帮助很大,非常感谢!
4天前
简单的简单
感谢你的贡献,论坛因你而更加精彩!
4天前
sergiojune
这个讨论对我很有帮助,谢谢!
4天前
X14Nuy
这个讨论对我很有帮助,谢谢!
4天前
mb_ikqlqfiu
你的帖子非常有用,感谢分享!
4天前
mb_fcagklmv
感谢你的积极参与,期待更多精彩内容!
4天前
超级卡卡罗特
为你点赞!
4天前
.KK
这个讨论对我很有帮助,谢谢!
4天前
New对象处
你的分享对大家帮助很大,非常感谢!
4天前
gfdg
感谢你分享这么好的资源!
4天前
mb_kdyaokdn
为你点赞!
4天前
老小白
感谢你的积极参与,期待更多精彩内容!
4天前
杨如画
感谢你分享这么好的资源!
4天前
风兮木晓
为你点赞!
4天前
fireworld
+1
你的分享对大家帮助很大,非常感谢!
4天前
nevinhappy
这个讨论对我很有帮助,谢谢!
4天前
马来
这个讨论对我很有帮助,谢谢!
4天前
yezheyu
这个讨论对我很有帮助,谢谢!
4天前
mb_oowzftna
感谢你分享这么好的资源!
4天前
蜉蝣129
谢谢你的细致分析,受益匪浅!
4天前
lrhtony
这个讨论对我很有帮助,谢谢!
4天前
Ram98
期待更多优质内容的分享,论坛有你更精彩!
4天前
linkin5epk
这个讨论对我很有帮助,谢谢!
4天前
王麻子本人
为你点赞!
4天前
疯子Tear
你的帖子非常有用,感谢分享!
4天前
叮叮当_468844
为你点赞!
5天前
CCC_
感谢你的积极参与,期待更多精彩内容!
5天前
不呲咔呲
为你点赞!
5天前
ke3l
为你点赞!
5天前
山间清爽的风
你的分享对大家帮助很大,非常感谢!
5天前
大肠刺身
期待更多优质内容的分享,论坛有你更精彩!
5天前
岁月。
为你点赞!
5天前
陈某人
为你点赞!
5天前
GloryRef
为你点赞!
5天前
juice4fun
你的帖子非常有用,感谢分享!
5天前
煜凡
这个讨论对我很有帮助,谢谢!
5天前
mb_nwjlihsi
你的帖子非常有用,感谢分享!
5天前
奇奇怪怪
感谢你的积极参与,期待更多精彩内容!
5天前
Simp1er
期待更多优质内容的分享,论坛有你更精彩!
5天前
令狐双
你的分享对大家帮助很大,非常感谢!
5天前
sk97
感谢你的贡献,论坛因你而更加精彩!
5天前
陈可牛
这个讨论对我很有帮助,谢谢!
5天前
ChuXinﻬ.
为你点赞!
5天前
mb_ifqtwleh
你的分享对大家帮助很大,非常感谢!
5天前
mb_asiwnxyv
期待更多优质内容的分享,论坛有你更精彩!
5天前
pexillove
你的分享对大家帮助很大,非常感谢!
5天前
霸气压萝莉
+1
非常支持你的观点!
5天前
顽劣
这个讨论对我很有帮助,谢谢!
5天前
mb_bppcorlj
感谢你分享这么好的资源!
5天前
huangyalei
感谢你的积极参与,期待更多精彩内容!
5天前
woainihehe
感谢你的贡献,论坛因你而更加精彩!
5天前
mb_rjdrqvpa
感谢你的积极参与,期待更多精彩内容!
5天前
逆向狗都不学
这个讨论对我很有帮助,谢谢!
5天前
最新回复 (60)
雪    币: 3
活跃值: (602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

厉害了

最后于 5天前 被夜惜风雨编辑 ,原因:
5天前
0
雪    币: 3
活跃值: (602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这种脚本不是通用的吧
5天前
0
雪    币: 253
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
脚本不通用,针对性分析的,只是提供思路
5天前
0
雪    币: 33
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习学习
5天前
0
雪    币: 1980
活跃值: (2313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习一下
5天前
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
感谢分享,向大佬学习
5天前
0
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
学习一下
5天前
0
雪    币: 2441
活跃值: (4267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习
5天前
0
雪    币: 24
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666
5天前
0
雪    币: 423
活跃值: (1669)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
学习一下
5天前
0
雪    币: 573
活跃值: (1094)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
学习
5天前
0
雪    币: 375
活跃值: (2476)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
学习一下
5天前
0
雪    币: 2794
活跃值: (3283)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
学习学习
5天前
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
学习
5天前
0
雪    币: 1000
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习
5天前
0
雪    币: 413
活跃值: (5423)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
学习
5天前
0
雪    币: 1632
活跃值: (2481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
厉害
5天前
0
雪    币: 7417
活跃值: (4747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢分享
5天前
0
雪    币: 25
活跃值: (1361)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
学习
5天前
0
雪    币: 931
活跃值: (304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习
5天前
0
雪    币: 30
活跃值: (936)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
1
5天前
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
学习
5天前
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
学习
4天前
0
雪    币: 1116
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
666
4天前
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册