安装
发现和上一题差不多,都是对输入的值做检验,看代码
校验函数是ncheck,校验值是 new a().a( inputVal.getBytes() );
根据等号补位的操作不难猜到这可能是类似base64的编码
而ncheck又是一个native函数
接下来用IDA打开libnative.so
找到函数窗口中的ncheck函数开始分析。
发现将传进来的字符串首先将前 16 个字符和 后 16 个字符交换位置,
然后将这个新字符串两两一组互相交换位置,
最后和MbT3sQgX039i3g==AQOoMQFPskB1Bsc7比较
接下来就简单了,把最后的密文
MbT3sQgX039i3g==AQOoMQFPskB1Bsc7
两两替换再前16和后16对调,脚本
flag = "MbT3sQgX039i3g==AQOoMQFPskB1Bsc7"
tmp = ""
for i in range(0, 32, 2):
tmp += flag[i+1] + flag[i]
tmp = tmp[16:]+tmp[:16]
print(tmp)
# QAoOQMPFks1BsB7cbM3TQsXg30i9g3==
也就是说,flag经过Java里那个a.a()那个奇怪的编码得到会得到QAoOQMPFks1BsB7cbM3TQsXg30i9g3==
取出字符集
把百度搜的python base64解码代码的字符串顺序换成刚刚取出来的
# 百度搜的base64解码代码,把替换成
def base64_decode(cipher_input):
# 定义64个字母字符串
letters = "i5jLW7S0GX6uf1cv3ny4q8es2Q+bdkYgKOIT/tAxUrFlVPzhmow9BHCMDpEaJRZN"
# 接收base64密文输入
cipher = cipher_input
# 计算密文中=号数量
number_cut = cipher.count('=')
# 逐个输出密文在letters字符串中序号二进制码
ascii_64 = ['{:0>6}'.format(bin(letters.index(i)).replace('0b', '')) for i in cipher if i != '=']
# 补充=号对应的二进制字节
ascii_string = ''.join(ascii_64) + '0' * 6 * number_cut
# 按照8字节一组计算十进制后求出对应的ascii码字符
ascii_8 = [chr(int(ascii_string[x:x + 8], 2)) for x in range(0, len(ascii_string), 8)]
# 返回明文字符串
plain_text = ''.join(ascii_8[0:len(ascii_8) - number_cut])
return plain_text
print(base64_decode("QAoOQMPFks1BsB7cbM3TQsXg30i9g3=="))
#flag{just_ANot#er_@p3}
解码QAoOQMPFks1BsB7cbM3TQsXg30i9g3==,解出 flag{just_ANot#er_@p3}