福到了_official
解题步骤
-
lsb r0g0b0通道,可得信息“fu dao le”。文件尾后信息“DM”
可用方式:lsb可用python脚本、stegsolve、zsteg等,文件尾后信息可用十六进制编辑器、pngcheck、zsteg等
-
“fu dao le”是我出题时取的倒贴福字的来历,有意迷惑而加的拼音提示。因此此处通过任意工具将图片倒置即可进行下一步
另外,两篇交上来的wp都有在stegsolve切换通道发现我在图片头尾留下lsb的痕迹,值得表扬
-
lsb r0/g0/b0通道(仅一个通道即可),可发现zip文件特征。若使用stegsolve可点击“save bin”直接保存.zip文件
-
解压压缩包可得文件“binary”,根据文件名提示,以二进制的角度看待这份文件才能有所突破。结合释出的hint,易知data matrix与之有所联系
-
misc经典操作,二进制转二维码,下附简单的python脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from PIL import Image
MAX = x # x替换为边长,你将得到一个x * x的二维码
img = Image.new("RGB", (MAX, MAX))
str = "" # 将二进制字符串复制至引号内
i = 0
for y in range(0, MAX):
for x in range(0, MAX):
if (str[i] == '1'):
img.putpixel([x, y], (0, 0, 0))
else:
img.putpixel([x, y], (255, 255, 255))
i += 1
img.show()
img.save("flag.png") -
在线网站扫一扫即可
出题人的小心思
- 可以看出这题的主要考点在于lsb的灵活处理以及相对未知的信息(如dm这一提示可能大部分新手难以反应出data matrix)
- lsb方面更核心的考点也许在于lsb的原理。如fu dao le这个字符串写入时,需要将字符串转换为二进制,同时将需要写入的像素的rgb值取出转为二进制,两者拼接。更具体些,比如将二进制数据“101”写入一个(0,0,0)像素,那你会得到一个(1,0,1)的几乎黑色的像素,以二进制来看则是(00000000,00000000,00000000)变成了(00000001,00000000,00000001),即将信息隐藏在最低有效位,而这对像素的微小改变难以被人眼所辨认出。理解原理后再看看那个压缩包,所有的信息被我同时分别写在rgb三个通道,这是lsb最基础的变式。因此,stegsolve切换不同通道看图片下面,会发现那些痕迹是一模一样的。另外在图片倒置前后,去观察一下lsb头尾的结果,可以想想为什么造成了不同,其实也是上面的原理哦。(其实也有另一个好处,zsteg可以快速以多种方式得到不同的结果,但是不能倒着拿到我想给的东西,这是一个小小的idea,诶嘿)
- 其实本不想出data matrix的,想出更常见的qrcode,奈何qrcode任一版本的边长*边长都无法被8整除,无法变为完整的一个字节,我担心会出什么事情所以用的dm。(以bit保存二进制信息也是我一个小小的idea,很多时候其实都是直接给你明文的01字符串的)
- 诚然网上有漫天的二进制转二维码脚本(我贴出来的也是copy别人的),但我很开心能看到有人用神奇的方式实现了二进制转黑白块。编写简单的python脚本是ctf必备的技能,慢慢接触python,你会爱上它的简单和强大
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ʕ·͡˔·Ɂ!