Java层分析
Init中生成flag.txt
按键处理中,将用户输入与flag.txt中内容比较。
直接在手机上找到了flag.txt文件,得到内容如下:
0ctf{Too_Simple_Sometimes_Naive!!!}
提交,发现不对。
So分析:
定位到init函数
猜测应该是so库对read函数进行了hook,导致java层读取的数据并不是文件中真正的内容。
另外checksig、checkstrace、checkptrace看这名字都知道不怀好意,checksig应该是对签名做判断,checkstrace和checkptrace应该是反调试的。
不过分析发现checkstrace实际是调用checkptrace。而checkptrace函数的代码肉眼看不出采用了什么反调试技术,只好上调试器看看。
结果调试发现checkptrace中间接调用调用的居然是read函数,所以基本猜测程序就是用checkptracehook了read。往下看,发现一个明显的异或操作,对read读入的内容进行异或。
直接在调试器中获取到异或的值,写了个程序解了一下:
charflag[]="0ctf{Too_Simple_Sometimes_Naive!!!}";
charkey[]={0x00,0x00,0x00,0x00,0x00,0x1D,0x1B,0x48,0x2C,0x0C,0x24,0x02,0x02,0x09,0x3A,0x0B,
0x3B,0x0E,0x03,0x3A,0x39,0x0C,0x08,0x11,0x00,0x00,0x1A,0x09,0x0C,0x29,0x20,0x58,
0x44,0x00,0x00};
for(inti = 0; i < strlen(flag); i++)
{
<span style="white-space:pre"> </span>flag[i]^=key[i];
}
printf("%s\n",flag);
flag为:0ctf{It's_More_Than_Meets_The_Eye!}