CTF

2015 MSC_2 writeup

Posted by Jieming Gu on 2016-12-06

本文为2015年MSC中第二题的writeup。

MSC_2 writeup

首先点我下载题目。本题中的反调试检测都是通过读取/proc/pid/statusTracerPid值来判断是否被调试,如果不为0则退成程序。通过修改Nexus 4手机内核让TracerPid恒为0来绕过反调试,修改内核教程点我查看。

在Java层有对APK进行签名校验,通过修改smali可以绕过。

解题思路:把精力放在函数对输入字符串进行的处理和比对上

用IDA反汇编,init_array中有反调试函数,Java_k2015_a2_Ch_ch是代码入口,f5生成伪代码进行动态调试。

1

首先给key初始化一个0x10的空间,并分别赋值k[i] = i。将输入拷贝到key

接下来调用mprotect动态解密check2,然后进入check2。对key进行变形,第一个字符对应的ASCII码加0,第二个加1, 第 3个加 2,…,第n个加n-1。

2

下一步就是解密并调用check3(跟上面是相同的解密和反调试手段),继续对key进行变形,字符串相加。3

计算得到的v57再进行一次变换生成v58,最终与byte_75004140进行对比。

4

5

本题的关键在于v27函数。进入函数后发现进行十轮计算,而且动态调试中看到了AES加密算法的置换表。

从网上查找资料发现这篇文章。本题是基于查表的方式实现AES加密,AES算法加密密钥:6BCDC67A6B2B7C9D8DA459B1AB9D0680

6

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