攻防世界 app-4 base64的理解

1.官方给了个apk,一言不合先逆
2.MainActivity中
在这里插入图片描述
大致意思要上传的东西经过base64加密 要变成5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=
接下来就好干了,直接去解码发现是乱码,为啥呢,因为这是newbase64,作者自己在上面改了一定的加密逻辑,那么去看他的base64怎么写的。
在这里插入图片描述
好家伙看不懂。
发现一个老哥的博客,还不错 点击这里
看了会奥,大致就是先转为ascii 然后变成二进制,然后合并在一起变成可以整被6整除(补0)然后6 6 6分割,然后对应码表。
那么反向的,对应码表回来, 然后 8 8 取 ,会有多的扔掉 估计都是0000
然后回到ascii 得到回来的代码。逻辑懂了,那岂不是右手就行?
好的,脑子说你会了,手说你不会,java代码网上没找到,找了个python代码,自己改了点贴出来

import string
# Base64的64个可打印字符
#letters = list( string . ascii_letters) + list(string.digits) + ['+', '/']
#print(letters)

letters=  "vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/"
#letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#print(letters)

#定义base64加密函数
def encryption(inputString):
    # 对每一个字节取ascii数值或unicode数值,然后转换为2进制
    ascii = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', ''))
             for i in inputString]
    #返回的加密文本
    outputString = ''
    # 不够3字节的整数倍,需要补齐“=”的个数
    equalNumber = 0
    #对每个字符的转换
    while ascii:
        #三个asciiw为一组
        AsciiList = ascii[:3]
        if len(AsciiList) != 3:
            #不满三个的,在后面加“=”
            while len(AsciiList) < 3:
                equalNumber += 1
                AsciiList += ['0'*8]
        #join方法连接成三个8字节的字符串
        tempString = ''.join(AsciiList)
        # 三个8字节的二进制,转换为4个6字节的二进制
        tempStringList = [tempString[x:x+6] for x in [0, 6, 12, 18]]
        # 二进制转为10进制
        tempStringList = [int(x, 2) for x in tempStringList]
        # 判断是否需要补“=”,只要equakNumber大于0即需要
        if equalNumber:
            tempStringList = tempStringList[0:4-equalNumber]
        #装换成那64个字符
        outputString += ''.join([letters[x] for x in tempStringList])
        ascii = ascii[3:]
    #在最后加上“=”
    outputString = outputString + '=' * equalNumber
    #返回加密后的文本
    return outputString

#定义base64解密函数
def decryption(inputString):
    # 对前面不是“=”的字节取索引,然后转换为2进制
    asciiList = ['{:0>6}'.format(str(bin(letters.index(i))).replace('0b', ''))
                      for i in inputString if i != '=']
    outputString = ''
    #补齐“=”的个数
    equalNumber = inputString.count('=')
    while asciiList:
        tempList = asciiList[:4]
        #转换成2进制字符串
        tempString = ''.join(tempList)
        # 对没有8位2进制的字符串补够8位2进制
        if len(tempString) % 8 != 0:
            tempString = tempString[0:-1*equalNumber*2]
        # 4个6字节的二进制  转换  为三个8字节的二进制
        tempStringList = [tempString[x:x+8] for x in [0, 8, 16]]
        # 二进制转为10进制 
        tempStringList = [int(x, 2) for x in tempStringList if x]
        #连接成字符串
        outputString += ''.join([chr(x) for x in tempStringList])
        asciiList = asciiList[4:]
    #print(output_str)
    return outputString

studentNumber = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
print("输入文本为:"+studentNumber)
#加密
encryptedText = encryption(studentNumber)
print("加密文本为:"+encryptedText)
#解密
decryptedText = decryption(studentNumber)
print("解密文本为:"+decryptedText)

import base64
#Python2中可直接编码打印
#Python3中的因为3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码utf-8。
#encodestr = base64.b64encode('5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='.encode('utf-8'))
#print("Python库中的base64编码:"+str(encodestr,'utf-8'))
#decodestr = base64.b64decode('5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='.decode('utf-8'))
#print("Python库中的base64解码:"+str(decodestr,'utf-8'))

如果不是真的菜,谁又愿意当一个搬运工呢,但是整个逻辑理解了。最后得到flag 在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值