一、原题
原题是给了一个zip压缩包,解压后是一个命名为misc5.5的png图片,但无法预览。
二、解题步骤
既然无法直接预览,先用010editor打开一下吧:
联想到png文件开头应该是89 50 4E 47,观察下题目给的png的开头是77 B0 B2 B9,会发现0x89+0x77=0x100, 0x50+0xB0=0x100, 0x4E+0xB2=0x100, 0x47+0xB9=0x100, 所以,只要用0x100减去现在png文件中的每个字节的16进制数即可恢复出可以预览的png图片。
但是要注意这里还有一个小坑,就是0x100是十进制数的256,而bytes格式最大只能表示到255,出现256会报错,所以题目原png文件中是0的位置,还是0,不能用0x100去减。
具体可以写Python脚本来做,而且做这道题的过程中,解决了上次做异或题目(也是菜狗杯的Misc题目之前写了博客)遇到的问题,其实就是把整个文件处理后的结果(int类型)放在list中,再把整个list放在bytes()中即可转换成bytes格式写入新的文件中,得到恢复的文件。而上次是计算一个数就转一次bytes写入新文件,就会在命令行中出来好多1.
三、解题用的Python脚本
ff=open('./misc5.5.png','rb')
data=ff.read()
l=[]
for dd in data:
if dd==0:
l.append(dd)
else:
l.append(0x100-dd)
ff=open('./1234.png','wb') #会新建一个可写入的新文件1234.png
ff.write(bytes(l))
ff.close()
将list整体转换bytes再写入新文件,执行后命令行中就不再出现很多1,而是301933,应该是文件大小:
运行后就可以看到恢复出的图片1234.png了,图上有flag。
ctfshow{84a3ca656e6d01e25bcb7e5f415491fa}
可能直接复制图片中的文本有时会把{变成(,交flag时还是要先仔细看下~