[XCTF] mobile EasyJNI

安装

发现和上一题差不多,都是对输入的值做检验,看代码

校验函数是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} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值