NSSCTF中MISC_funneypng解题总结

2 篇文章 0 订阅
1 篇文章 0 订阅

一、知识背景
RGB为三原色,A为透明度
图片的位深度
图片常见深度有:
8Bit(包含四个通道:RGBA,每个通道分别占有2bit)
12Bit(包含三个通道:RGB,每个通道分别占有4bit)
24Bit(包含三个通道:RGB,每个通道分别占有8bit)
32Bit(包含四个通道:RGB,每个通道分别占有8bit)
以上说明的只是常见情况,并不是绝对的哦。
二、解题思路
拿到题目,第一步下载附件查看,是一张PNG图片
在这里插入图片描述
1.使用图片隐写神器stegsolve打开查看每个通道展示的图片情况
在Red plane0通道发现一张只有一半的二维码
在这里插入图片描述
进一步的思路就是找到另一半二维码,当我翻完所有通道之后发现另一半并没有找到。
2.使用Data Extract查看是否有LSB与MSB隐写(一般都是在低位隐写,可以自己多试试其他通道位置)
在这里插入图片描述
在这里插入图片描述
最近并没有发现什么奇怪的地方
3.既然图片里没发现什么隐写位置,查看一下图片属性,也有可能需要修改图片的高来进行查看flag(个人尝试过将高度增加,并没有隐藏的信息)
在这里插入图片描述
但是在图片属性这里发现了一个问题。位深度太大了!!!!!再加上使用stegsolve时发现A通道其实是空白,说明其实该图片只有三个通道RGB,那么每个通道深度就是48/3=16bit,但是图片显示最高通道就只有8bit。说明该图片隐藏了另外的8bit的信息。

(小知识:文中的8bit指的是二进制0000 0000,RGB每个都有8bit,说明每个通道有256种颜色,则三个通道都有256种,总过能组成的颜色就是256256256=16777216)

正常图片显示,最大就是取每个通道的高8bit,该题每个通道有16bit,
在这里插入图片描述
三个点的值对应一个像素点!!!
这里我用python脚本读取该图片的每个像素点对应的十进制值,正常来说一个像素点最大为(255,255,255)
从图中我们发现(我们以前三个值为例子,列表中每三个值对应一个像素点的颜色),前三个值分别为18760,12850,22359。每个值都远大于255,就是因为他是16bit,说明18760对应的是一个十六位二进制0100100101001000
在这里插入图片描述
上图中转化为二进制如果不够16位,可以在前面补零。

因为图片只能显示8bit,所以第一个像素点我们看到的是0100 1001,后8bit被题目隐藏起来了。
所以我们可以遍历图片所有像素点的十进制数据如:18760,将其除以256再取余数,得到的余数就是被隐藏起来的后8bit。

tips:除以256的原因是高8bit是256的倍数,隐藏起来的8bit是小于256的,所以要除以256,余数就是后8bit

按照这个思路把原来的图片所有像素点修改之后,注意要把深度改为8bit,因为我们指提取了8bit出来

import png
import time

img = png.Reader('funnypng.png')
imginfo = img.read()
w, h, imgdata = imginfo[:3]
data = []
for linedata in imgdata:
    line = []
    for d in linedata:
        line.append(d%(2**8))  
    data.append(line)
with open('front2.png', 'wb') as f:
    img2 = png.Writer(width=w, height=h, greyscale=False, bitdepth=8)
    img2.write(f, data)

保存图片名为front2.png,再用stegsolve打开后,在Blue plane 0通道发现另外一半二维码
在这里插入图片描述
把两张二维码拼接之后,需要对数据区进行修复
在这里插入图片描述

所以第一种方法就是 XOR 其对应的掩码后然后手动解数据,就和 SECCON CTF 2014: QR (Easy) Write-up 类似。不过还可以直接用 qrazybox 提供的工具进行暴力解
在这里插入图片描述
这里就不细说这个工具了,up主也不是特别了解。修复好图片后即可扫描得到flag

NSSCTF{fbef863db8331e8c63f73d7a04c1cf5b}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

透明的胡萝卜_robots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值