首页
社区
课程
招聘
[原创]MSC解题报告
发表于: 2015-1-26 19:17 21125

[原创]MSC解题报告

2015-1-26 19:17
21125
第一题
看代码是从logo.png这张图片的最后,读取一个映射表,和最终比较的密码,然后通过输入的字符的转换,去比较是否和最终密码相等。但注意到每段下面都有log输出。因此直接装手机上跑一跑,果然点击按键之后会有中文的表和所需正确密码的中文输出,尝试输入几个字符查看对应的中文后,可以找到对应关系,得到最后的密码。

第二题
Java层没做什么,直接把输入放到底层的libcrackme.so里做了判断。发现JNI_Onload里做了些处理,接着securityCheck里面最后有判断,将输入和一个wojiushidaan做比较。输入后发现密码错误,因此可以猜测前面一大段逻辑的作用就是会把这个最终的字符串改掉。其实只需要知道最终判断时候那个地址上的值就行了,先尝试了调试,发现一旦attach就退出,做了反调试。注意到比较之前有个android_log_print函数,因此可以直接利用这个函数做打印。我选择patch方法是直接把这个函数往下移,因为在0x12A4地址处正好有需要的数据给了R2,所以我把从0x1284到0x129C的地方都NOP了,在0x12AC的地方调用log函数。把patch好的so直接放回去,随便输入就能看到最终比较的密码了。

第三题
看代码很明显加过壳了,用的是整体的DEX加密方案。使用之前自己开发过的Dalvik的动态分析框架来做动态分析时的解析。参见CIT 2014的论文:
DIAS:Automated Online Analysis for Android Applications
使用的思想大概就是直接修改dalvik源代码,在解释器层面去获取程序动态运行时的信息。脱壳的话也可以使用这个思想,程序一定会在解释执行时被解密,只需要在解释器上去获取DexFile这个结构体的信息就可以了,我直接用了dexdump的代码。运行以后直接可以得到脱壳后的dexdump结果。后面是dex逆向,比较简单,就是dexdump的文本没有反编译成Java的好看,不过程序不大,关键逻辑不多也关系不大。后面唯一的问题是在后一个比较中需要对某个类的annotation做比较,dexdump里没有做annotation的dump。不过问题不大,因为在DIAS解释器层面我依然可以监控到这个getAnnotation函数的返回值,因此直接得到后,换成莫尔斯电码输入就是password了。

第四题
第一步一样是脱壳,和上一题一样,直接脱出来后发现程序会再去调用M$j方法,是个native的。看了下so,这题lib目录看上去和上一题差不多,libmobisecy.so解压是个内容都是空的dex,想必另一个mobisecz就是解密以后填充进去的代码,脱壳已经脱出来了,就不用管,因此可以判断native方法调用应该是在libmobisec.so中。这个so做了混淆,各种头被破坏得难以修复,所以采用动态的方法。运行程序以后随便输内容,点击出现错误后,直接去dd进程的内存。这样这个so就是已经执行过的了。接着是去找M$j的地址,因为JNI方法一定会出现在常量字符串表里,找了下M$j,发现没有,想必使用了RegiterNative做了变换的。因此继续使用DIAS系统,在调用这个方法的时候去打印insns的值,就是地址了。结果发现被映射到了个很奇怪的内存区域,不过那块正好也是rwx的,所以输入结果应该没错。Dd那一段,根据地址找到指令,又LOAD PC指回了dump出来的libmobisec里,到那个地方就能直接看代码了。这里有个技巧,就是看dump出来的so时,需要先用IDA载入libc,在载入这个dump后的so,根据内存分布调整偏移,这样就能让IDA辨认出so中的libc函数了。程序做了些控制流的混淆,正常流程被转成了类似状态转移的几层死循环,另外就是普通的一些字符串加解密操作也做了混淆,一个简单的异或也被展开成一个很长的等价与和或操作等等。不过关系不大,因为这个so是dd出来的,执行过的关键的字符串都解密了,甚至可以直接跳到那段区域去看解密的所有字符串,可以看到接下来会调用的bh类的a方法,以及之后会调用的一系列函数的字符串如sendEmptyMessage以及参数类型等字符串,值得注意的是由两个非常可疑的base64字符串。先不急,先回上去看Java层的bh类的a方法,发现是经过了几个Java层的函数变换,再经过几个native层的函数变换。大概可以猜到整个程序的逻辑,就是输入经过native和java层函数的来回传递,最终做比较,比较在native层。JAVA层的代码比较简单,不多说。Native的变换需要去逆向另外两个函数M$d和M$z。不过当使用DIAS监控这两个方法的输入输出时,我们发现参数本身并没有做复杂的变换,通过变换输入,发现这几个native的方法只有M$d对第四个字节做了个固定的变换,其他复杂的变换都在dex里。唯一的问题是得不到最后比较的字符串。脑洞一开,直接用之前观察到的两个base64字符串试了下,其中一个经过逆变换直接可以变成有意义的字符串,可以肯定是password了。

第五题
Java层没做加壳,也没什么内容,直接把输入字符串给了native方法,返回就是1或0。第一个想法是把so抠出来,自己写个程序去调用。So又被破坏,IDA辨认不出,继续使用dd大法。由于在自己进程里,因此可以通过修改地址来做代码注入,使用adbi工具来监控函数的输入输出,发现里面经过一些简单可逆的逻辑后,有个复杂算法,没有能力逆向算法,但可以使用暴力破解。最终运行了两个多小时后爆出结果。

非常幸运这次比赛可以得奖,这次比赛运气非常好,一方面得益于本次比赛题目使用动态分析能够很快理出头绪,另一方面得益于本人之前的积淀,自己科研使用的工具能够直接派上用场也是非常幸运,因为单纯的静态分析和逆向能力本人肯定比不过看雪上的多数工业界的前辈。最后感谢我所在的上海交通大学密码与计算机安全实验室的老师的培养和知识传授,以及同学的技术交流和讨论。

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

收藏
免费 1
支持
分享
最新回复 (50)
雪    币: 11124
活跃值: (3090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排 恭喜得奖!
2015-1-26 19:22
0
雪    币: 188
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
天才少年啊~~

帮你贴一个以前的作品~
http://loccs.sjtu.edu.cn/typecho/index.php/archives/236/
2015-1-26 19:22
0
雪    币: 5431
活跃值: (3522)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
4
围观大牛,最后一个直接“爆”结果也真是暴力呀
2015-1-26 19:39
0
雪    币: 958
活跃值: (174)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
学习了.
2015-1-26 19:58
0
雪    币: 4687
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
围观大牛啊~~只有拜膜。 然后接着努力学习
2015-1-26 20:03
0
雪    币: 141
活跃值: (54)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
Hi,你好 请问DD大法是什么?能详细一点吗?谢谢了!
2015-1-26 20:07
0
雪    币: 335
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
骚年果然很牛X...
2015-1-26 20:07
0
雪    币: 6092
活跃值: (714)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
从第三题开始就不太知道说的是什么
可否提问下?
自己开发过的Dalvik的动态分析框架 -------------可否共享一下 ,只是想见识一下
DIAS:Automated Online Analysis for Android Applications ------可不可以发下 这个pdf 或者word文档 这个百度不到。
希望大牛可以满足 小菜鸟的小愿望,谢谢了。
2015-1-26 20:08
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
积累很深厚啊。。第一题jd-gui关键的两段代码反不出来。。我试着对着字节码还原代码。。没成功。。放弃了。。哦。。我不是搞安全的。。我就是试试
2015-1-26 20:09
0
雪    币: 16
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
jeb直接出源码……
然后拿着源码在eclipse直接算出来的……
上传的附件:
2015-1-26 20:37
1
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
12
最后一题爆破的想法不错。
做法和楼主的差别还是很大的,稍等一下也发帖吐槽一下
2015-1-26 20:44
0
雪    币: 205
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
怎么感觉,别人的工具早就等待阿里的题目了啊 ...
2015-1-26 20:44
0
雪    币: 105
活跃值: (211)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
暴破字典怎么来的呀
2015-1-26 20:45
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
15
oops的博士大牛不得不服!
2015-1-26 20:52
0
雪    币: 35
活跃值: (139)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
赞! 思路真不错
2015-1-26 20:52
0
雪    币: 546
活跃值: (1642)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
17
来看大牛解体思路,受教了。
2015-1-26 21:11
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
受教,还是需要去积累啊
2015-1-26 21:49
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
确实厉害。
2015-1-26 21:50
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
围观大牛思路
2015-1-26 22:29
0
雪    币: 149
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
厉害厉害~~
DIAS:Automated Online Analysis for Android Applications
这个论文可否分享一下?
2015-1-26 23:11
0
雪    币: 7
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
前2题跟我的解法一样,后面的能不能详细介绍一下呀
2015-1-26 23:14
0
雪    币: 6976
活跃值: (1472)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
23
确实很牛, 楼主谦虚了. 楼主的方法很好, 对的, 为什么我们不改个自己的rom出来呢! 这样应该就简单多了!
2015-1-26 23:21
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
前来学习大牛总结
2015-1-26 23:56
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
25
确实厉害,不得不服,希望楼主有时间,多在看雪上发一些学习资料,供大家学习参考
2015-1-27 09:36
0
游客
登录 | 注册 方可回帖
返回
//