xctf-writeup-easyapk

easy-apk解题报告

下载得到apk,先打开看一下,发现是一个简单的文件输入然后点击事件,猜测是加密匹配

使用JEB打开文件

1586501038330

输入文件经过base64New转码之后得到5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=

以下是Base64New:

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
public String Base64Encode(byte[] bytes) {
StringBuilder res = new StringBuilder();
for (int i = 0; i <= bytes.length - 1; i += 3) {
byte[] enBytes = new byte[4];
byte tmp = 0;
// 每次取偏移三次
for (int k = 0; k <= 2; k++) {
// i 为当前第一个字节 i+k是第k个字节的下标
if (i + k <= bytes.length - 1) {
// & 1 屏蔽高位,只保留最低的8位
// >>> 为无符号右移
enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp);
// tmp 保存的是上一次取6位之后剩余的数组
tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);
} else {
enBytes[k] = tmp;
tmp = 64;
}
}
enBytes[3] = tmp;
// enBytes存放的是切分之后的数组
for (int k2 = 0; k2 <= 3; k2++) {
if (enBytes[k2] <= 63) {
res.append(Base64ByteToStr[enBytes[k2]]);
} else {
res.append('=');
}
}
}
return res.toString();
}

可以看到,索引表被替换了,写脚本如下:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from hashlib import *


def base64_decode(str_list):
list_base = []
# 第一个左移两位
a = str_list[0] << 2
# 第二个字符低4位
c = str_list[1] & 15
# 加上第二个高2位
b = str_list[1] >> 4

# 第一个转换字符 6 + 2(剩下4)
a = a | b
list_base.append(a)
# 左移4位
c = c << 4
# 第三个字符低2位
a = str_list[2] & 3
# 第三个字符高4位
b = str_list[2] >> 2
# 第二个转换字符 4 + 4(剩下2)
c = c | b
list_base.append(c)

# 第三个字符低2位左移6位
a = a << 6
# 加上第四个字符
a = a | str_list[3]
# 第三个转换字符
list_base.append(a)
return list_base


byte_to_str = ['v', 'w', 'x', 'r', 's', 't', 'u', 'o',
'p', 'q', '3', '4', '5', '6', '7', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'y', 'z', '0', '1', '2', 'P', 'Q',
'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O',
'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W',
'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', '8', '9', '+', '/']
table = "".join([i for i in byte_to_str])
cipher_test = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
ans = ''
i = 0
while i <= len(cipher_test) - 1:
list1 = []
equal_num = 0
for k in range(4):
if cipher_test[i+k] is '=':
list1.append(0)
equal_num += 1
else:
list1.append(table.index(cipher_test[i+k]))
ba = base64_decode(list1)
for j in range(3-equal_num):
ch = chr(ba[j])
ans += str(ch)
i += 4

flag = 'flag{' + format(ans) + '}'
print(flag)

得到flag:flag{05397c42f9b6da593a3644162d36eb01}

总结

一个简单的base64转码题目,不过将转换表更换了,只需要写出解码函数即可,熟悉一遍解码函数