步骤
下载所给附件,发现是一个压缩包,解压之后发现两个文件夹,分别为:
其中_MACOSX文件夹中有一个图片,但是打不开
使用winhex工具查看,根据头文件发现不是jpg图片
在gif文件夹中发现104张图片,都可以正常打开。使用winhex随便打开一张图片进行分析,发现确实是jpg
根据分析,图片有104张(0-103)为8的倍数,而且只有黑白两种颜色,可能是二进制
我们先让白色为0,黑色为1,得出一串二进制字符串
使用python脚本帮助我们进行转换:
white = open(r"C:\Users\admin\Desktop\misc\gif\0.jpg", "rb").read()
black = open(r"C:\Users\admin\Desktop\misc\gif\1.jpg", "rb").read()
flag_b = ""
for i in range(104):
with open(r"C:\Users\admin\Desktop\misc\gif\%d.jpg"%i, "rb") as f:
text = f.read()
if text == black:
flag_b += '1'
elif text == white:
flag_b += '0'
print(flag_b)
转换完成之后我们就得到了一个二进制字符串,然后将它转换成ASCII码,顺序:二进制->十进制->ASCII,同样使用python帮我们做:
flag = ""
for i in range(len(flag_b )//8):
# print(i)
# print(flag_b[i*8:(i+1)*8])
flag += chr(int(flag_b[i*8:(i+1)*8], 2))
print(flag)
完整的程序如下:
white = open(r"C:\Users\admin\Desktop\misc\gif\0.jpg", "rb").read() # 以二进制只读的方式打开文件,定义白色图片
white2 = open(r"C:\Users\admin\Desktop\misc\gif\3.jpg", "rb").read()
black = open(r"C:\Users\admin\Desktop\misc\gif\1.jpg", "rb").read() # 以二进制只读的方式打开文件,定义黑色图片
black2 = open(r"C:\Users\admin\Desktop\misc\gif\2.jpg", "rb").read()
# print(white==white2) True
# print(black==black2) True
# print(white==black) False
# 可以看见相同颜色的图片读取出来都是一样的,所以可以根据读取的内容是否与上面定义的white和black相等来判断图片是什么颜色
flag_b = "" # 定义空字符串用来存储二进制字符串
for i in range(104):
with open(r"C:\Users\admin\Desktop\misc\gif\%d.jpg"%i, "rb") as f:
text = f.read()
if text == black:
flag_b += '1'
elif text == white:
flag_b += '0'
print(flag_b)
flag = "" # 定义空字符传来存储flag
# 这里要用//而不是/
# “ / ” 为浮点数除法,返回浮点结果
# “ // ” 表示整数除法,返回不大于结果的一个最大整数
for i in range(len(flag_b )//8):
# print(i)
# print(flag_b[i*8:(i+1)*8])
flag += chr(int(flag_b[i*8:(i+1)*8], 2))
# 字符转数字ord(字符)
# 数字转字符chr(数字)
print(flag)
运行程序,得到flag
总结
常见密码学的应用(二进制)
要擅长使用代码来帮助我们