zip 伪加密
拿到zip包也没有任何提示的情况下,第一个想到的是zip伪加密,或者就是暴力强行破解(一般设置stringprintable的字典,不超过6位还是能算的)。
这个直接拖进winhex或者HxD里面去看,zip文件前面直接找50 4B 03 04
,把在它两个字节之后的09改00即可(实际伪加密一般为50 4B 03 04 14 00 09 00 08 00
,09的第二位只要是奇数都代表加密),最好把文件中的这样的十六进制串都改一改。然后找50 4B 01 02
,一般在末尾,在它后面4个字节的09改成00即可。
上面的方法也可以自己产生zip伪加密的包。
伪加密破开后,就可以拿到两个图片如下:
![](/images/hint.png)
![](/images/flag.jpg)
拿到hint.png里面的信息(难)
hint图片是一个png图片,我一般拿到图片没有其他可用信息的时候,就大概可以这几个方面看一看:
binwalk hint.jpg
看有没藏东西- 看图片的其他详细信息comment等等,这些地方可以藏一些提示。
pngcheck -v hint.jpg
看png具体的信息以及各个IADT- stegsolve打开看看,可以extract大部分信息,以及不同的alpha通道查看图片。
这个题我比赛的时候看出来这个hint.pngde IDAT块有点问题了(但是方向错了也仅限于此)
![](/DASCTF2021/check.png)
IDAT块的分布是连续的,并且一般只有填满之后才会继续填下一块,图中第三个IADT块长度为2308,明显没有填满,怀疑是人为隐写进去的信息,类似的题是2018全国信息安全大赛的一道png隐写,idat块内隐写了一个二维码。所以比赛的时候方向都是围着这个长2308的IDAT块来做的。但是这个块不是zlib,也不是其他什么文件头。(就卡住了)
比赛结束看到一个writeup说删去第一个IDAT块就能得到hint.png的第二张图片。(所以删去后得到了一张不明所以的图,暂时搁这里,应该不能直接删,还要改CRC校验什么的,后面再说)
好家伙,是我理解有偏差了,之前的想法是对的,那个2308的块明显异常,所以这是有两个图片,长2308的IDAT块是第一个图片的结束处,后面再插上其他图片的IDAT块,就可以隐写了(只会显示第一个图片)。所以直接把前面四个IDAT块删去,就能拿到隐写的第二张图片。直接上脚本,或者在HxD里面删。
1 | import zlib |
正确的图得到信息是you can guess out where is flag with 89504E
outguess 提取flag.jpg的隐写信息
后面基本就没难度了
1 | $ outguess -k 89504E -r flag.jpg -t output.txt |
得到一串字符,明显就是base64编码(看到这个要么是可恢复成一连串字符串,恢复不了看16进制找文件头,或者直接转图片)。
MUY4QjA4MDg5MTgwNzg1RTAwMDM2NjZDNjE2NzJFNzQ3ODc0MDA0QkNCNDk0Q0FGMzZCMDMwMzQ0RDM1NDlCNjRDMzMzNTMzMzRCMTQ4MzVCNzQ4NEEzNTMzNDg0OTMyMzU0QjRFMzUzMTQ5MzFCNUFDRTVFMjAyMDA0NjhCMjIzRjI4MDAwMDAw
转成16进制看看(自己写python脚本或者去在线网站,这里推荐CyberChef)
这里直接是16进制字符串,不能直接转可打印字符,搜一下文件头,发现是7z压缩包。直接转文件:
1 | data='1F8B08089180785E0003666C61672E747874004BCB494CAF36B030344D3549B64C33353334B14835B7484A3533484932354B4E35314931B5ACE5E20200468B223F28000000' |
解压得到最后的flagflag{0815e4c9f56148e78be60db56ce44d59}