首页
社区
课程
招聘
[原创]阿里2015MSC前两题解题方法
发表于: 2015-10-21 13:41 12512

[原创]阿里2015MSC前两题解题方法

2015-10-21 13:41
12512
阿里2015MSC前两题解题方法

一 . 第一题:


1.1 使用方法:插桩重打包法。
分析代码发现:






4731629302360568292该值是样本中固定的值,
4731629302360172366是输入0之后得到的值
4731629302360172367是输入1之后得到的值
故此得出正确的值是4731629302360568292 - 4731629302360172366 = 395926。

二. 第二题解题思路:


2.1 第二题通过java层代码可以看出来,关键掉在so文件中的ch函数中,该函数返回值为1,则验证就通过了。

2.2 先静态分析下libxbox.so,分析一下流程:
首先来到ch函数处:




进入0x24C8函数,发现该函数明显经过加密处理,先看我解密完的代码:




0x14A4也是经过加密处理的,先看我解密完的代码:



0x24c8函数中计算得到的f(password),又经过一轮运算得到了M(f(password)),此值经过AES加密与: 5CDA772FA3C63E39B6F0F3ED515A9986比较:




所以,要想得到正确的password,需要如下几步:
i.  AES解密,密文为5CDA772FA3C63E39B6F0F3ED515A9986,密钥为0x6BCDC67A  0x6B2B7C9D  0x8DA459B1  0xAB9D0680
解密得到:8A1F4B6E59CAF25205CA27DE04C2E9DB
ii. 解密M(f(password))。
iii. 解密f(password)函数,得到正确的password。

反调试(异常)分析:
发现有反调试检测TracerPid:



再分析该so文件的.init_array:



依次分析这几个函数,发现0x1424、0x3160处均有反调试,将pthread_create、clone函数nop掉,nop掉之后及时补回。



线程函数地址0x1460,发现在循环检测TracePid:



反调试二:



反调试三:




其中还有信号接收的相关异常,在动态调试中进行介绍。

2.2 使用IDA动态调试APK,进行分析。
2.2.1调试方法简要介绍下:
启动android_server



转发端口:



将apk以等待调试的模式调起:



使用IDA附加k2015.a2进程:
在libdvm.so的_Z17dvmLoadNativeCodePKcP6ObjectPPc函数下断;
修改Debugger Options:



开启DDMS,并在IDA F9运行后,执行下面的命令:



这样IDA就能中断在_Z17dvmLoadNativeCodePKcP6ObjectPPc函数。

2.2.2 继续分析,进入libwbox.so
记录下libwbox.so的基址0x5048300,双击进入libwbox.so,在ch函数下断。
根据上文提到的0x1424、0x3160反调试,与基址相加,nop掉关键函数。
这样,就能运行并中断在Java_k2015_a2_Ch_ch了。



F9之后,手机提示输入password,我们输入假码123456,直接点解确定按钮,这时中断在Java_k2015_a2_Ch_ch函数了:



判断输入的password的长度,如果不足16位,则按位补足到16位(补足方法为length(password),之后顺次加一,直到0XF):
输入为123456,补完后:



根据上面的静态分析,我们可以直接进入关键函数分析代码,不再赘述:
继续F8运行,为了保险起见,在每次调用memset函数后的地址处,将TracerPid的值手动改为0,IDA的快捷键为F2.



解密0x24C8处的代码:



F7进入0x24C8函数:

f(password):



生成类斐波那契数列:
原始:



经过f(password)之后:



解密0x14A4:



进入0x14A4函数:
M(f(password))对password进行第二次处理:



按位相加加法因子,得到的加法因子为:
加法因子在计算的时候,有一个陷阱,即读取0x1DE0处的自己时,第二、第三、第四字节产生了变化,需要手都修复,然后与0x51AC处的数据异或,长度为0x6E8,如下图所示:



这样最终得到正确的加法因子:
1F BC DA FF E6 4C BC 44 F5 B8 13 C8 EC A8 CD BD


对0x5388起始,大小为0x988的数据进行解密,解密出来的内容为AES加密算法:



解密0x5388处,大小为0x988的数据0,解密方法按位跟0x4D进行异或:



解密完成blx R5进去:
AES key:



走完AES函数后,通过AES计算出的值与0x5D10处的16字节的数据比较,如果不想等,则给R8赋值为0,程序error。




2.2.3 反推出正确的password

使用AES解密A1 = 5C DA 77 2F A3 C6 3E 39 B6 F0 F3 ED 51 5A 99 86
key为:0x6BCDC67A  0x6B2B7C9D  0x8DA459B1  0xAB9D0680

得到:
A2 = 8A 1F 4B 6E 59 CA F2 52 05 CA 27 DE 04 C2 E9 DB

A3(加法因子) = 1F BC DA FF E6 4C BC 44 F5 B8 13 C8 EC A8 CD BD
A2减去A3加法因子,如果为负,则高位补1
A4 = A3 - A2 = 6B 63 71 6F 73 7E 36 0E 10 12 14 16 18 1A 1C 1E
f(A4)计算最终结果:
A5 = f(A4) = 6B 62 6F 6C 6F 79 30,转换为ascii码为kboloy0

所以正确的password即为kboloy0

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//