前言

全程划水的我还是要跟着大哥混才有饭吃

开干

题目首先给了一个 Android APK,应用名为where is flag,包名为com.example.iscc.whereisflag,下载下来安装先看看:

​图中只有一个 GetFlag 按钮,点击之后会弹出一个flag {you can do it 666}的 Toast,很明显不是我们需要的东西,直接上apktool

解包之后,按照之前做题的经验,res 目录里面可能会有东西,果不其然:app-release/res/values/strings.xml 文件中:


找到了一个被分成了三段的base64编码:RmxhZyU3QllvdXJBcmVDYW5keQ==,解出来是:Flag{YourAreCandy

接下来开始寻找第二部分,使用 JEB 直接打开 APK:

APK 并没有做混淆,直接跟进 MainActivity ,右键单击它并将 smali 代码转为 Java 代码:

可以看到按钮的 onCreate 事件中会先调用上面的 Check 函数检测 Flag 是否正确,如果不正确就输出 666 那串字符。经过分析得出:

由于前半段 Flag 已经拿到,所以可以确定该 Flag 的最后一位是 },花括号的 ASCII 值为 125,所以有以下推导:

若偶数位最后一位是 },根据第八条规律(偶数位[0] - 偶数位[1] == 4),125-121=4,121 对应的 ASCII 是小写字母 y,所以偶数倒数第二位为字母 y
设奇数位第一位为N,那么奇数位第二位为 N+4,第三位为 N-4,根据规则第三位和第四位必须相同。所以我们得到:

1
2
3
4
5
6
奇数位数组:
n
(n+4)
(n-4)
(n-4)
0
1
2
3
4
5
6
偶数位数组:
未知
y (ASCII:121)
未知
} (ASCII:125)
0

于是我们可以大致推测出后半段的部分是 ?????y?},自己写了个 Python 脚本指定 ASCII 进行爆破,得到结果:

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
flag is +c/y'y'}
flag is ,c0y(n(}
flag is ,n0y(n(}
flag is -c1y)c)}
flag is -n1y)c)}
flag is 5c9y1y1}
flag is 5n9y1y1}
flag is 5y9y1y1}
flag is 6c:y2n2}
flag is 6n:y2n2}
flag is 6y:y2n2}
flag is 7c;y3c3}
flag is 7n;y3c3}
flag is 7y;y3c3}
flag is ?cCy;y;}
flag is ?nCy;y;}
flag is ?yCy;y;}
flag is @cDy<n<}
flag is @nDy<n<}
flag is @yDy<n<}
flag is AcEy=c=}
flag is AnEy=c=}
flag is AyEy=c=}
flag is InMyEyE}
flag is IyMyEyE}
flag is JyNyFnF}
flag is KyOyGcG}

最后发现倒数第四条是正确的flag,拼接得到:Flag{YourAreCandyInMyEyE}