[SWPU2019]Network
附件是一个txt文件,打开看到都是些数字
每一行都只有一个值,63,255,191等等,不难发现,这些值都为2的n次方减去一后的值,此处为TTL加密。
TTL加密:
简单来说就是,图中63,127,191,255转化为二进制的值分别为 00111111,01111111,10111111,11111111。
发现只有前两位不同,TTL加密就是利用前两位进行加密,将每个前两位重新进行合并,8位为一组。
所以TTL加密的解密方法:
1.将所有前两位合并为8位,并且每八位一组。
2.将上面的每组转化为十六进制的字符
使用脚本解密
import binascii
f = open('attachment.txt', "r")
str = ''
Binary = ''
number = ''
while 1:
num = f.readline()
if not num:
break
if num.rstrip() == '63': # 去掉每行后面的空格
Binary = '00'
elif num.rstrip() == '127':
Binary = '01'
elif num.rstrip() == '191':
Binary = '10'
elif num.rstrip() == '255':
Binary = '11'
str += Binary
for i in range(0, len(str), 8):
number += chr(int(str[i:i + 8], 2))
data = binascii.unhexlify(number)
f2=open('1.txt','wb')
f2.write(data)
f2.close()
把1.txt放入010发现是一个zip文件,改后缀打开发现有密码
010中猜测是伪加密,修改加密位后打开
后面双==,并且内容中存在大于7的数字和a-z,为base64加密。
Base64加密原理:
Base64要求把每三个bit的字节转换为四个6bit的字节(3*8 = 4*6 = 24),然后把6bit再添两位高位0,组成四个8bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
例子:
对10101101,10111010,01110110进行base64加密,从尾开始每六位为一组,前面补两组0
转换后 00101011, 00011011 ,00101001 ,00110110。
十进制 43 27 41 54对应base64表中的r b p 2。
假如要加密的数据加密数据不足三位,就得使用=进行填充,比如原文a,不足三位,后面就得补==号,缺一位就补一个=号。
既然讲到base64加密,顺便把base32加密学习一下
base32加密原理:
任意给定一个二进制数据,以5个位(bit)为一组进行切分,不足用0填充,对切分而成的每个组进行编码,转换为十进制对应base32表中的一个字符。
例子:对01100010,01101000,01110011,01110100进行base32加密
每5个bit切割:01100,01001,10100,00111,00110,11101,00000
十进制对应 12,9,20,7,6,29,0
对应base32索引表中的:MJUHG5A。
同样Base32按5比特切分的二进制数据必须是40比特的倍数(5个8比特),不足则用=填充。
base32和base64显著区别: base64的范围为(a-z,A-Z,0-9,/,+),base32范围(A-Z,0-7)。
通过脚本把结果跑出来
import base64
f=open('flag.txt','r')
data=f.readlines()[0]
while True:
data=base64.b64decode(data)
if '{' in data:
print data
exit(0)
flag{189ff9e5b743ae95f940a6ccc6dbd9ab}
标签:Binary,加密,Network,base64,num,base32,data,SWPU2019 From: https://www.cnblogs.com/fishjumpriver/p/18013560