[NSSRound#3 Team]funnypng

说明:这题我也是根据透明的胡萝卜_robots 的WP,写一下我的理解加上复现。

[NSSRound#3 Team]funnypng_第1张图片

  1. 先看属性是48bit,我们可以用opencv读一下,看看是几个通道的
import cv2


img = cv2.imread("./funnypng.png", cv2.IMREAD_UNCHANGED)
print(img.shape[-1])
运行结果:
3

cv2.IMREAD_UNCHANGED 表示,保持原图状态读取,如果你不加,那他只会读取8bit,这些小细节要注意。

根据运行结果3,我们就知道是RGB三个通道,再根据图片属性的48bit,也就是R和G和B每个通道占48 / 3 = 16(bit),也就比正常情况的8bit多了8bit,首先你能理解这个地方,后面就比较好理解了。


[NSSRound#3 Team]funnypng_第2张图片

  1. 我们使用stegsolve读取图片,发现图片的R通道的最低位隐写了一个二维码,由于这个工具只会读取图片的8bit,也就是说原图是16bit,我们的前8bit被读取了,发现了半个二维码,另外半个二维码,其实被出题人放到了后8bit里面,所以现在的目标就是提取后面的8bit;也就是00000000 00000000,我们要提取后8bit的。

上才艺:

import cv2
import numpy as np


img = cv2.imread("./funnypng.png", cv2.IMREAD_UNCHANGED)

img2 = img & 0xFF
img2 = img2.astype(np.uint8)

cv2.imwrite("./fun.png", img2)

  1. 后8bit已经被我们提取到了,所以说会opencv真的很爽,虽然我会的也不多,哈哈哈

[NSSRound#3 Team]funnypng_第3张图片

可以看到后8bit的B通道的最后一位隐写了另一半二维码,我们拿到了另一半了。


用ps稍微处理一下:

[NSSRound#3 Team]funnypng_第4张图片

这种被涂鸦的使用:QRazyBox

[NSSRound#3 Team]funnypng_第5张图片

[NSSRound#3 Team]funnypng_第6张图片

找到二维码目录,导入二维码。

[NSSRound#3 Team]funnypng_第7张图片

[NSSRound#3 Team]funnypng_第8张图片

[NSSRound#3 Team]funnypng_第9张图片

NSSCTF{fbef863db8331e8c63f73d7a04c1cf5b}

总结:出题人的思路是每个通道16bit,前8bit会默认被软件处理,后8bit不会被处理,所以就可以进行隐写,很有创意的题目~

你可能感兴趣的:(网络安全,python)