先运行试试
静态看主函数:
主函数com.vnctf2022.cm1.MainActivity
进入com.vnctf2022.cm1.MainActivity看看
发现调用com.vnctf2022.cm1.MainActivity的同时,还一同执行了com.vnctf2022.cm1.Main,待会可以分析它
点击按钮触发第55行onClick函数,输出:多少说点吧~,entering mission…
然后等待50秒
然后调用网址把第一次输入的话写进网址里
看com.vnctf2022.cm1.Main
check函数对第二次的输入进行验证
调用了loadDexClass类的hcheck函数
先创建一个dex对象,然后把ooo文件复制进去
调用com.vnctf2022.cm1.Haha函数,最后看返回值进行比较
但是ooo文件不是dex文件,可能copyFiles函数有古怪
发现果然对ooo进行了更改
显然是ooo文件和vn2022逐字节异或,但是异或出来的de无法编译成jar包,
byte[] bArr = new byte[1024]是关键,表示一次只能开辟1024字节的空间,即每次从文件读取1024个字节
因为int read = inputStream.read(bArr),所以read一次只能读取ooo 1024个字节,下面i的取值是[0,1024),bytes实际上是bytes[i%1024%6]
脚本
f=open(r'ooo','rb').read()
s='vn2022'
dex=[]
for i in range(len(f)):
dex.append((f[i]^ord(s[i%1024%6]))&0xff)
ff=open(r'out.dex','wb')
ff.write(bytes(dex))
ff.close()
或者动态把ooo异或后的文件dump下来,但是发现没有文件
Jd-gui反编译jar包(不知道为什么jadx-gui反编译不了==)
找到Haha里的hcheck函数,加密逻辑是个xxtea,直接逆就行
cc='H4pPY_VNCTF!!OvO'
lis=[]
for i in range(0,len(cc),4):
t=0
for j in range(4):
t|=(ord(cc[i+j])<<(8*j))
lis.append(t)
print([hex(i) for i in lis])
print(lis)
得到key[1349530696, 1314283353, 558257219, 1333153569]
xxtea求解:
#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
while (--rounds);
}
}
int main()
{
char v[]={ 68, 39, -92, 108, -82, -18, 72, -55, 74, -56, 38, 11, 60, 84, 97, -40, 87, 71, 99, -82, 120, 104, 47, -71, -58, -57, 0, 33, 42, 38, -44, -39, -60, 113, -2, 92, -75, 118, -77, 50, -121, 43, 32, -106 };
uint32_t const k[4]= {1349530696, 1314283353, 558257219, 1333153569};
int n = sizeof(v) / sizeof(uint32_t);
btea((uint32_t*)v, -n, k);
printf("%s ",v);
return 0;
}