解题步骤

  1. lsb r0g0b0通道,可得信息“fu dao le”。文件尾后信息“DM”

    可用方式:lsb可用python脚本、stegsolve、zsteg等,文件尾后信息可用十六进制编辑器、pngcheck、zsteg等

  2. “fu dao le”是我出题时取的倒贴福字的来历,有意迷惑而加的拼音提示。因此此处通过任意工具将图片倒置即可进行下一步

    另外,两篇交上来的wp都有在stegsolve切换通道发现我在图片头尾留下lsb的痕迹,值得表扬

  3. lsb r0/g0/b0通道(仅一个通道即可),可发现zip文件特征。若使用stegsolve可点击“save bin”直接保存.zip文件

  4. 解压压缩包可得文件“binary”,根据文件名提示,以二进制的角度看待这份文件才能有所突破。结合释出的hint,易知data matrix与之有所联系

  5. misc经典操作,二进制转二维码,下附简单的python脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    from 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")
  6. 在线网站扫一扫即可

出题人的小心思

  1. 可以看出这题的主要考点在于lsb的灵活处理以及相对未知的信息(如dm这一提示可能大部分新手难以反应出data matrix)
  2. 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,诶嘿)
  3. 其实本不想出data matrix的,想出更常见的qrcode,奈何qrcode任一版本的边长*边长都无法被8整除,无法变为完整的一个字节,我担心会出什么事情所以用的dm。(以bit保存二进制信息也是我一个小小的idea,很多时候其实都是直接给你明文的01字符串的)
  4. 诚然网上有漫天的二进制转二维码脚本(我贴出来的也是copy别人的),但我很开心能看到有人用神奇的方式实现了二进制转黑白块。编写简单的python脚本是ctf必备的技能,慢慢接触python,你会爱上它的简单和强大