本文为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
。