题目来自于XCTF的gif,题目下载下来之后发现是一堆黑白块,而且有104张,很显然8整除104,所以猜测这个可能是转成了01串,具体什么颜色转成什么数字测试一下即可,可以两种情况试一下。
编写解密脚本如下:
解密脚本:
from PIL import Image
path = 'C:\\Users\\DELL\\Desktop\\gif\\{index}'
result=''
num=0 #此参数为计数参数,每八个就加一个空格,方便我们辨认。
for i in range(0, 104):
real_path = path.format(index=i) + '.jpg'
im = Image.open(real_path, 'r')
pix=im.load()
Color=pix[0,0][0] #提取出每张图片的第一个色素块,帮助我们判断。黑色的RGB值为255,因为是个三位数字,所以我们得取出第一个值
if Color==255:
result+='0'
num+=1
else:
result+='1'
num+=1
if num==8:
result+=' '
num=0
print(result)
得到01字符串:
01100110 01101100 01100001 01100111 01111011 01000110 01110101 01001110 01011111 01100111 01101001 01000110 01111101
然后尝试去解码字符(感觉应该是ASCII码),可以先试一试第一个数字,看他解出来的字符是不是f,以此来判定黑色对应的是0还是1。
最终的转码加解码的代码如下:这里是直接把转成字符串的代码嵌入到了上面代码中的for循环里面。
from PIL import Image
path = 'C:\\Users\\DELL\\Desktop\\gif\\{index}'
result=''
num=0 #此参数为计数参数,每八个就加一个空格,方便我们辨认。
for i in range(0, 104):
real_path = path.format(index=i) + '.jpg'
im = Image.open(real_path, 'r')
pix=im.load()
Color=pix[0,0][0] #提取出每张图片的第一个色素块,帮助我们判断。黑色的RGB值为255,因为是个三位数字,所以我们得取出第一个值
if Color==255:
result+='0'
num+=1
else:
result+='1'
num+=1
if num==8:
print(chr(int(result,2)),end='')
result=''
num=0