NSSCTF Round5 Misc Grating 出题人笔记

做 CCBC12 有感而发,感觉光栅图片挺好玩的,就出了一个类似光栅的题目了,至于为什么说类似是因为这个比例不太能直接用遮挡的方式看出 flag,需要提取操作。

CCBC12 最后是这样的

为了加点难度,只能给更模糊的信息了,其实如果高度改的好的话,还是可以正儿八经用光栅,但是为了这道题手动写了一套像素的图片,想搞成批量生成就变成了这样了((

根据光栅化的原理,手动搓了一个脚本(,由于 Pillow 用的太少(说白了就是比赛摆烂强行让 re 队员帮忙写),现在遭报应了,就只能这样勉强写写了,求不被骂呜呜呜

from PIL import Image

flag = 'NSSCTF{*}'
blockLen = len(flag) // 3 + (len(flag) % 3 >= 1)
imageLen = blockLen * 5
finalImage = Image.new('RGB', (imageLen + blockLen, 5), (255, 255, 255))
finalPixel = finalImage.load()
for color in range(3):
    for imagePixelX in range(5):
        for flagPointer in range(blockLen):
            if flagPointer + color * blockLen < len(flag):
                tempImage = Image.open(flag[flagPointer + color * blockLen] + '.png')
                tempPixel = tempImage.load()
                for imagePixelY in range(5):
                    if tempPixel[imagePixelX, imagePixelY] == (0, 0, 0, 255):
                        tempPixelList = list(finalPixel[flagPointer + imagePixelX * 12, imagePixelY])
                        tempPixelList[color] -= 1
                        finalPixel[flagPointer + imagePixelX * 12, imagePixelY] = tuple(tempPixelList)
                tempImage.close()
finalImage.save('Grating4.png')
finalImage.close()

强行把光栅图片改成的图片操作题(

Writeup

根据题目信息,光栅动画原理是遮挡其他部分剩下的部分显示出动画内容,那其实有点像栅栏加密。

拿到图片看到白的第一时间瞟一眼 LSB,看到只有 3 个 0 通道有信息,那就应该是对三个 0 通道进行操作。

先猜下光栅动画的缝宽和黑线宽度(说人话就是每隔几位取一次像素)

根据题目信息给的长度 36 平分给每一个通道是 12 个信息位,那一个信息位对于 6 列像素

那么第一个信息位对于的像素条文是第 0,12,24,36,48,60 列,取出来之后看 Stegsolver 里面 R0 有个字母 N G0 有个 R B0 有个 I 剩下来的就好解决了。

from PIL import Image

sourceImage = Image.open('Grating.png')
sourcePixel = sourceImage.load()
sourceImageSizeX = sourceImage.size[0]
sourceImageSizeY = sourceImage.size[1]
resultImage = Image.new('RGB', (sourceImageSizeX, sourceImageSizeY), (255, 255, 255))
resultPixel = resultImage.load()
blockSize = 6
blockCount = sourceImageSizeX // blockSize + (sourceImageSizeX % blockSize >= 1)
for i in range(blockSize):
   for j in range(blockCount):
       for height in range(sourceImageSizeY):
           resultPixel[((j * blockSize + i) % sourceImageSizeX), height] = sourcePixel[(i * blockCount + j), height]

resultImage.save('Grating_Decrypt.png')
resultImage.close()

Pillow 用的不熟练,脚本写的有点臭,能看懂就行()

Grating1
Grating2
Grating3

当然最后还是放大一点为什么题目不放大呢,因为懒得重新写脚本(,最后处理完放大看会好点。

感谢观看我的博客~
NSSCTF Round5 Misc Grating 出题人笔记
https://www.wd-ljt.com/post/0828/879.html
来源于问谛居,转载记得联系作者哟~
THE END
分享
二维码
海报
NSSCTF Round5 Misc Grating 出题人笔记
做 CCBC12 有感而发,感觉光栅图片挺好玩的,就出了一个类似光栅的题目了,至于为什么说类似是因为这个比例不太能直接用遮挡的方式看出 flag,需要提取操作。……
<<上一篇
下一篇>>