xctf-writeup-easyjni

easy-jni 解题报告

下载打开文件,发现是一个输入flag然后check的题目

JEB打开

1586954211658

发现调用了方法a

1586954753160

调用了class a中的方法,分析之后发现是变种之后的base64算法,然后调用了native层的ncheck方法,得到反回结果。

native 层分析

1586964092798

输入的base64两轮转换:

  1. 前16位和后16位换位置
  2. 奇数位置和偶数位置互换

然后和MbT3sQgX039i3g==AQOoMQFPskB1Bsc7比较

写脚本如下:

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
64
65
66
67
68
69
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

s = "MbT3sQgX039i3g==AQOoMQFPskB1Bsc7"
s_list = list(s)
for i in range(0,32,2):
s_list[i], s_list[i+1] = s_list[i+1], s_list[i]
#print(s_list)
for i in range(16):
s_list[i], s_list[i+16] = s_list[i+16], s_list[i]

cipher_test = "".join([x for x in s_list])
ans = ''
#print(cipher_test)

byte_to_str = ['i', '5', 'j', 'L', 'W', '7', 'S', '0',
'G', 'X', '6', 'u', 'f', '1', 'c', 'v',
'3', 'n', 'y', '4', 'q', '8', 'e', 's',
'2', 'Q', '+', 'b', 'd', 'k', 'Y', 'g',
'K', 'O', 'I', 'T', '/', 't', 'A', 'x',
'U', 'r', 'F', 'l', 'V', 'P', 'z', 'h',
'm', 'o', 'w', '9', 'B', 'H', 'C', 'M',
'D', 'p', 'E', 'a', 'J', 'R', 'Z', 'N']
table = "".join([i for i in byte_to_str])

i = 0
while i < len(cipher_test):
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
print(ans)

总结

一个java层base64加一个native层简单的转换,没有太大难度,结果

flag{just_ANot#er_@p3}