[miniVN] ezAndroid

题目信息

题目名称: ezAndroid
类型: Reverse Engineering / Android

解题过程

直接 jadx 打开,定位到 MainActivity

逻辑就是先检查 flag 的长度是否为 31、是否是 VNCTF{} 格式,然后把花括号内部的内容分别传进 check1check2

再去 value/strings.xml 找到 AES 用的 key。

用 CyberChef 解出第一部分。

从这里可以看到 check2 的逻辑在 so 层,解压 apk 用 IDA 打开 so 文件。

发现是一个 XTEA 加密,key 已经给出了:Th1sIsAn3asyChal

再通过交叉引用找到 delta 的值。

写出解密脚本解出第二部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import struct

def u32(x):
return x & 0xFFFFFFFF

keyy = [0x73316854, 0x6E417349, 0x79736133, 0x6C616843]

enc_v1, enc_v2 = 0xAD05217D, 0xF7C0C3E2

delta = 1743291877

sum_ = u32(delta * 32)

v1, v2 = enc_v1, enc_v2

for _ in range(32):
v2 = u32(v2 - ((keyy[(sum_ >> 8) & 3] + sum_) ^ (v1 + ((v1 >> 5) ^ (4 * v1)))))
v1 = u32(v1 - ((keyy[sum_ & 3] + sum_) ^ (v2 + ((v2 >> 6) ^ (8 * v2)))))
sum_ = u32(sum_ - delta)

flag_bytes = struct.pack('<II', v1, v2)

print('bytes:', flag_bytes)
print('hex :', flag_bytes.hex())
try:
print('utf-8:', flag_bytes.decode('utf-8'))
except UnicodeDecodeError:
print('latin1:', flag_bytes.decode('latin-1'))
# nd_xt3a!

最终得到完整 flag:VNCTF{u_Know_@ndro1d_And_xt3a!}

阅读 加载中...