之前对隐写比较感兴趣,研究过一些CTF中隐写的东西,但是这次xctf发现大概全忘了。实时证明,光靠脑子还是信不过的,学习嘛,还是得时不时做点总结的。结合这次的xctf,看大佬writeup加自己查的一些关于隐写的解题思路资料,收集到这儿,以后做题时参考一下。
最简单的隐写–图种
第一次看到的隐写术,是一种叫做图种的东西。所谓图种是最简单的,就是利用图片和压缩包的格式,将两者的二进制数据接起来,对于图片查看器,会读取jpeg的头部和尾部,忽略多余部分;而对于解压器,也是寻找其头部。这样也就做到了隐藏信息。这种就简单的用解压软件解压就行了,不再话下。
more
中间忽略了其他思路,这次时间比较赶,以下直接说一下这次的题目,其他的等个时间专门整理下。(主要是大佬的writeup默认懂的都懂,看懂都费了个劲)
图片尾缀信息隐写–zlib后缀
故名思意,在图片尾部加入一些信息,并将各种编码等知识点揉在一起玩,直接上这次的题,右图是目标图片:
binwalk查看下:
binwalk task_ctf_04_Lx5phgB.png
结果如图:
可以看到,其中藏有zlib后缀,写个脚本恢复一下得到xxx,嗯没错,大佬的writeup就是这样写了一句,我查了好一会……
首先用winhex打开图片,找到binwalk中指向的偏移,将后半部分直接复制下来,用脚本处理如下:
import base64
import zlib
import binascii
#将zlib后缀复制放入字符串,后面可以解码成十六进制,新技能get
fin='789CAD50C98EA3400CFD200E8182247098830B025448104B586F2C99222C0D094958BE7E4033DD9A5B5FDAB29E9FED27DBB2CB8182B10DB03868DE50B3C3D3CA2C1AD0253F08B0E20A1192AAD89544E34C346F7F6CBA7C5BE150E42BE318D5312F382E7E3CB0CF7035709B566713CB10C57B9D7193345FE1999614C9AD1610499A5ED14E51BBD8946F0DC8FEA5B736EFB1C898F963FFC14C83AEE0FB237A5FB797A04ECE720C2A4A7C7C029B6CE0BB3BE5B5F9D7C817C3658A9C5AA6403F0B8017AA99532F84093BA8BBDA427D213D2E10DEBD4D32E9E879C6DEA15731FDA75F46FB2BD78705940CD4A77D0D9D3645023DDF043EB459C32A0586188574D751FB7BC915BBF3B2462DE3E05844A8A786C6BD33DEA659E32FB52D4B34B348B581A69A3AE772B553EC969243DCA59A4749390ED7D06CE360ECC90C0CB9ADBAFA15BB309E64DCA53710D340AAF260AC2DCA1A4406FAFFEEA0F1A79475BABCA9E724905E4E789C529EECBE34C90F4517C4938B872834E71C49532CC3DEF8FC05C0AF3FA454C1D3'
data=fin.decode('hex')
#zlib解压缩
temp = binascii.hexlify(zlib.decompress(data))
bb64=temp.decode('hex')
#解码后发现貌似是base64,继续base64解码后写入文件
ret = base64.b64decode(bb64)
with open('result','w') as f:
f.write(ret)
这里观察头部为4B 50 03 04,容易联想到zip压缩包的头部,为50 4B 03 04,交换头两个字节,双击打开后发现注释上给出了password:
为加密压缩包无疑,在python2.7中输入1/0,得到password为:integer division or modulo by zero
解压后cat得到flag