本文为2015年MSC中第二题的writeup。
MSC_2 writeup
首先点我下载题目。本题中的反调试检测都是通过读取/proc/pid/status中TracerPid值来判断是否被调试,如果不为0则退成程序。通过修改Nexus 4手机内核让TracerPid恒为0来绕过反调试,修改内核教程点我查看。
在Java层有对APK进行签名校验,通过修改smali可以绕过。
解题思路:把精力放在函数对输入字符串进行的处理和比对上。
用IDA反汇编,init_array中有反调试函数,Java_k2015_a2_Ch_ch是代码入口,f5生成伪代码进行动态调试。

首先给key初始化一个0x10的空间,并分别赋值k[i] = i。将输入拷贝到key。
接下来调用mprotect动态解密check2,然后进入check2。对key进行变形,第一个字符对应的ASCII码加0,第二个加1, 第 3个加 2,…,第n个加n-1。

下一步就是解密并调用check3(跟上面是相同的解密和反调试手段),继续对key进行变形,字符串相加。
计算得到的v57再进行一次变换生成v58,最终与byte_75004140进行对比。


本题的关键在于v27函数。进入函数后发现进行十轮计算,而且动态调试中看到了AES加密算法的置换表。
从网上查找资料发现这篇文章。本题是基于查表的方式实现AES加密,AES算法加密密钥:6BCDC67A6B2B7C9D8DA459B1AB9D0680。

AES解密得到8a 1f 4b 6e 59 ca f2 52 05 ca 27 de 04 c2 e9 db,
减1f bc da ff e6 4c bc 44 f5 b8 13 c8 ec a8 cd bd,
减00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f,
得到6b 62 6f 6c 6f 79 30 07 08 09 0a 0b 0c 0d 0e 0f。
输入为 kboloy0。