glass
题目解压之后发现是apk文件,更改后缀为.zip,再次解压
看到有.dex文件。dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。我们使用dex2jar反编译该文件。
把class.dex复制到dex2jar.bat所在目录,即dex2jar目录下。打开cmd,进入dex2jar所在的目录然后运行dex2jar.bat classes.dex,生成classes-dex2jar.jar就是所要转化jar包。
使用jd-gui打开classes-dex2jar.jar
我们可以看到函数里面存在native定义,并且,在整个java代码里面没有checkFlag的定义,只有一个声明,这些都说明函数是定义在so文件之中的。
我们来寻找需要的so文件。
题目的lib文件里面只有一个so文件,正好也是寻找的native的so文件。
使用ida对其进行反编译。
通过搜索checkFlag函数找到该函数
我们可以知道flag的长度应该是39位的
接下来看函数sub_FFC
和sub_1088
sub_FFC:
sub_1088:
可以很明显的可以看出来是RC4加密,不清楚的同学可以对照百度百科上面的代码比较,会发现非常相像。同时,RC4的加密脚本也就是它的解密脚本。
那么checkFlag中的12345678就是key。
我们再查看函数sub_10D4
:
可以看到对RC4处理完成的字符串再次进行处理,先进行异或,后面还有一些处理,看似复杂但是不用太在意,写脚本的时候直接倒回去就可以。
返回主checkFlag,我们发现最后得到的字符要和unk_497C
进行比较。
unk_497C:
Shift+E提取一下
写脚本破解
#include<stdio.h>
void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
int i=0,j=0;
unsigned char k[256]={
0};
unsigned char tmp=0;
for(i=0;i<256;i++)
{
s[i]=i;
k[i]=key[i%Len];
}
for(i=0;i<256;i++)
{
j=(j+s[i]+k[i])%256;
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
int i=0,j=0<