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