首页
论坛
课程
招聘
[逆向分析] [原创]逆向分析反调试+ollvm混淆的Crackme
2021-2-24 13:18 6236

[逆向分析] [原创]逆向分析反调试+ollvm混淆的Crackme

2021-2-24 13:18
6236

最近学了点ollvm相关的分析方法,正好之前朋友发我一个小demo拿来练练手.

 

图片描述
看上去很简单 就是找flag用jadx打开发现加壳了
图片描述
然后想试试直接用fridadexdump脱壳的时候发现frida上就崩了

 

图片描述
上葫芦娃的strongfrida 直接重启了!....

 

这只能去过反调试了,打开so找了下.init和.initarray(反调试常见位置,so比较早的加载时机)
图片描述
ctrl+s 打开 initarray里面有两个奇怪的函数 decode,这就是ollvm默认的字符串加密
图片描述
导出函数中搜索init 找到里面也有函数定义,创建了一个线程执行反调试函数,进入这个函数看到字符串都被加密了
图片描述
看了下代码 有个kill函数,一开始就行hook kill函数不让他自杀,发现没用...

 

图片描述
然后我继续找了下发现有个strstr函数 这有点可疑,拿来比较字符串的,直接hook一波
图片描述

 

从代码中得知str2是我们要关心的对象,是个char*类型直接readCstring打印

 

然后发现出现很多frida 然后进程就崩了
图片描述

 

所以接下来就有两种方法 直接hook create_pthread不让这个线程程起来 和 hook strstr,我这就直接hook str了.
图片描述

 

然后就不崩了,可以愉快的frida了~

 

先拖个壳,Fridadexdump一波(可以直接fart脱的全,但是懒的刷机,直接用这个了..),hook events定位
图片描述

 

图片描述

 

oncreate直接是native化了 应该是360的vmp, 这里肯定不是让你逆360的vmp,盲猜一波就是check方法,先hook一下.

 

图片描述

 

直接返回false,应该是true就会拿到flag,为了不每次都手动输入 直接写个主动调用.
图片描述
接下来去看so了,导出函数就这几个..肯定是动态注册,先直接hook
图片描述
图片描述

 

hook到了偏移,去so看一下
图片描述
改了些名字后 操作流程就是将输入的jstring转为char* 然后判断长度是否为20看到很多都是unk_开头的,这些就是被ollvm加密后的字符串,要怎么看他解密后的内容呢?因为他加载到内存的时候肯定是解密状态,直接读这个地址打印cstring就可以得到解密后的字符串了.
图片描述
然后继续改名,改完名字就是这样
图片描述
发现他重新对check的方法进行了动态注册,然后sub_1234 里面也进行了动态注册里面嵌套了好几次动态注册,然后用strcmp比较 输入的值和 &unk_5100(解密后为kanxue) 如果相等那就返回true. 但是输入要20个字符 kanxue 只有6个字符,我们hook一下这个比较的地方看看,

 

直接hook strcmp蹦的比较厉害,我选择inlinehook,按tab切换到汇编,打开opcode,s1的值给到了R0 我选择在0x1564进行hook,因为是 2个opcode 所以为thumb指令,需要地址+1
图片描述
图片描述
图片描述
我们输入了kanxue00000000000000,hexdump打印s1,发现s1就是kanxue,但是程序没提示通过,然后hook registernative hook到他又进行了2次动态注册,根据这个地址 我们往前找
图片描述
图片描述
发现第二次动态注册的和最开始的代码很像,第三次就短了很多,然后仔细一看第二次动态注册中又注册了sub_1148, 原来就是嵌套了3次动态注册,注册了3个函数,根据一开始的分析 对strcmp这里的字符串解密

 

图片描述
然后inlinehook剩下几个分别strcmp验证下
图片描述
发现第二次比较是输入的8个0 这样区分不了是第几个输入,我们用abcd来实验,输入kanxueabcdefghieklfn 20个字符
图片描述
是abcdefgh 这8个,所以是加到kanxue后面的,然后真正的字符串之前我们已经解密了,是unk_50F7(即为training),然后后面猜也猜得到剩下6个字符是之前解密的unk_5096(即为course) 为了保证严谨性,我就在inlinehook一次

 

图片描述

 

果然就是我们最后六位进行比较 所以答案前面的解密的字符合起来,就是 kanxuetrainingcourse
图片描述
图片描述
这里有个bug 每次输错都要重启一次,不然到最后答案就变成course或者trainingcourse了~


第五届安全开发者峰会(SDC 2021)议题征集正式开启!

上传的附件:
收藏
点赞4
打赏
分享
最新回复 (12)
雪    币: 1753
活跃值: 活跃值 (318)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
r0ysue 活跃值 1 2021-2-24 13:18
2
1
我是肉丝小号
雪    币: 7210
活跃值: 活跃值 (2175)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 活跃值 4 2021-2-24 13:33
3
0
写的一手好文,最重要的也有详细分析思路,也是学习的好资料
雪    币: 72
活跃值: 活跃值 (297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ogli324 活跃值 2021-2-24 14:01
4
0
这就是三万班的嘛,tql, 爱了爱了
雪    币: 186
活跃值: 活跃值 (1063)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
葫芦娃 活跃值 1 2021-2-24 14:11
5
1
附文中工具地址:
FRIDA-DEXDump: https://github.com/hluwa/FRIDA-DEXDump
StrongR-Frida: https://github.com/hluwa/strongR-frida-android
WatchEvent: https://github.com/hluwa/objection-plugins/tree/master/watch_events

woc, 这是 hluwa 铁粉,差点以为这是我自己写的文章,肉丝渣男。
雪    币: 3755
活跃值: 活跃值 (1298)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
roysue 活跃值 3 2021-2-24 14:15
6
0
葫芦娃 附文中工具地址: FRIDA-DEXDump: https://github.com/hluwa/FRIDA-DEXDump StrongR-Frida: https://github.com/h ...
没错我就是你的铁粉,呼噜娃大佬nnb
雪    币: 1753
活跃值: 活跃值 (318)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
r0ysue 活跃值 1 2021-2-24 14:21
7
0
葫芦娃 附文中工具地址: FRIDA-DEXDump: https://github.com/hluwa/FRIDA-DEXDump StrongR-Frida: https://github.com/h ...
没错我就是你的铁粉,呼噜娃大佬nnb
雪    币: 12895
活跃值: 活跃值 (2036)
能力值: ( LV13,RANK:824 )
在线值:
发帖
回帖
粉丝
大帅锅 活跃值 4 2021-2-24 14:32
8
1
直接给我笑尿了
雪    币: 291
活跃值: 活跃值 (430)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
darbra 活跃值 2021-2-24 14:55
9
0
厉害了 原来是丝老师的大作
雪    币: 11
活跃值: 活跃值 (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluegatar 活跃值 2021-2-24 15:44
10
0
葫芦娃牛逼,爱你
雪    币: 11
活跃值: 活跃值 (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluegatar 活跃值 2021-2-24 16:05
11
0
@葫芦娃

WatchEvent: https://github.com/hluwa/objection-plugins/tree/master/watch_events

这个挂了
雪    币: 250
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
@=llfly 活跃值 2021-3-1 11:22
12
0
肉丝葫芦娃    牛逼!
雪    币: 236
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
卡卡鸡 活跃值 2021-4-6 17:26
13
0
注册3次静态函数有什么意义?不都是调用jint RegisterNatives(JNIEnv *env, jclass clazz,const JNINativeMethod *methods, jint nMethods)这个函数?hook他就可以了
游客
登录 | 注册 方可回帖
返回