解题过程

首先,看MainActivity,猜测b中handleMessage是判断最终条件,onClick是检验flag方法

MainActivity

然后查看引用输入字符串obj的a类中,doInBackground应该是对输入字符串进行解密

类a

查看doInBackground引用的b类

类b

可以看出这是对字符串的一个异或

再去看a类中的onPostExcute方法,以及除了a、b类以外的c类,猜测这是一起为最后为检测结果进行判定的方法

目录

c类,可以看出这是一个比较结果的方法

类c

程序逻辑

输入flag–>进入a类不断进入b类进行循环–>进入c类进行结果比较

解题脚本

由于按照程序原本的逻辑,我写出的脚本无法生成flag,且网上暂时没有该题的writeup,我只好使用另一种方法。

程序的逻辑是将字符串不断地进行异或,最后的结果其实相当于进行一次异或,而这一次异或的数字是未知,因此可以写一个循环去爆破它。

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
30
31
32
final = ['z', 'p', '}', '{', 'g', 'v', '}', 'u', 'o', 't', 'z', '$', '%', '.', '/', '(', '.', '-', '/', 'v', 'w', 'v',
't', 'a']

for i in range(100):
num = [0] * 24
f = 0
for q in range(len(final)):
num[q] = (ord(final[q]) ^ i)
if num[q] >= 128:
f = 1
break
if num[q] <= 31:
f = 1
break
if f == 1:
break
else:
print("the i is: ", i)
for t in num:
print(chr(t), end="")
print()
# 结果
# the i is: 27
# akf`|mfntoa?>543564mlmoz
# the i is: 28
# flag{jaishf89234213jkjh}
# the i is: 29
# gm`fzk`hrig98325302kjki|
# the i is: 30
# dnceyhckqjd:;016031hihj
# the i is: 31
# eobdxibjpke;:107120ihik~

flag{jaishf89234213jkjh}