似乎是寒假做任务时候遇到的比较有意思的一道题

搜了一下原题是dasctf的隐写《YUSA的小秘密》

这题给出的最直接提示就是YCBCr(不懂

遂直接去搜索YCrCb的意思

1
YCrCb即YUV,主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

​ ——百度百科

好像懂了又好像没懂

找一找类似的题目

得到一份ByteCTF 2020的题《Hardcore Watermark 01》的WP

1
图片中每个像素可以通过三个值(通道)来表示,常见的是 R(red)G(green)B(blue) 模式。而本题用到的通道是 YCrCb。通过 cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)对 img 图片数据进行色彩空间转换,即可得到三个通道的数据。

大概意思应该是RGB的三个通道变成了YUV三个通道

知道原理之后就可以去使用代码了(这个菜逼仍然不去学Python

这里要使用cv2模块(不懂什么是cv2

1
2
3
4
5
6
7
8
9
10
from cv2 import cv2 as cv

def photo_change():
img = cv.imread(r'lsb.png')
src = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)
Y, Cr, Cb = cv.split(src)
cv.imwrite(r'flag.png', (Y % 2) * 255)

if __name__=='__main__':
photo_change()

最后就能得出结果了(过于掉san所以不放图片,实际上是懒得上传到GH再拿下来

1
DASCTF{2947b683036d49e5681f83f7bc3fbb34}