menu FzWjScJの菜鸡记录
ByteCTF2020——两道魔鬼水印题
507 浏览 | 2020-10-25 | 阅读时间: 约 2 分钟 | 分类: CTF | 标签: misc,CTF,隐写
请注意,本文编写于 39 天前,最后修改于 38 天前,其中某些信息可能已经过时。

呜呜呜,被北邮大佬们带飞

MISC

Hardcore Watermark 01

Description

厌烦了用工具解图片题?那么来点硬核的~

链接: https://pan.baidu.com/s/1lKNYV4_X2Aqx8-qPB2Z_uw 密码: 6597
(备用下载:https://drive.google.com/drive/folders/1MsAZfHq2G61AQQCv_CBajmjnPUXlIBIo?usp=sharing

Analyze

开局一张图,丢入stegsolve中发现各个颜色最低位有二维码的印记

因为一开始没什么想法,于是便去找了找原图,发现原图在http://tech.china.com.cn/roll/20200622/367168.shtml

丢入stegsolve进行sub处理后得到(别问为什么是sub,就是因为sub比较清楚)

然后猜测是某一个色域的像素值确定一个二维码,于是脚本画出二维码图发现:

from PIL import Image

p = Image.open('x.bmp')
a,b = p.size


for n in range(3):
    np = Image.new('RGB', (a, b), (255, 255, 255))
    if n == 0:
        for y in range(b):
            for x in range(a):
                if p.getpixel((x,y))[0]>240:
                    np.putpixel((x,y),(255,0,p.getpixel((x,y))[2]))
        np.save('r.png')
    elif n == 1:
        for y in range(b):
            for x in range(a):
                if p.getpixel((x,y))[1]>=240:
                    np.putpixel((x,y),p.getpixel((x,y)))
        np.save('g.png')
    else:
        for y in range(b):
            for x in range(a):
                if p.getpixel((x,y))[2]>240:
                    np.putpixel((x,y),p.getpixel((x,y)))
        np.save('b.png')

r.png:

g.png:

b.png:

然后得到的图经过PS的阙值

得到

同样操作截图并分隔得到三段二维码,将头和尾部反色操作后得:

拼接后得到:

但是并扫不出来,中间有段模糊的

于是用qrazybox手撸二维码:

解码发现:

使用另外一个工具:

得到flag:

flag

ByteCTF{ByteCTF-2020 FLAG!GALF 0202-FTCetyB10001000}

Hardcore Watermark 02

Description

题目附件: 点击下载附件 1

hint:分块隐藏

Analyze

相比于第一题,第二题感觉偏脑洞(这个出题人第二题感觉也不想是要让我们写脚本啊),首先开局一个jpg

然后我们查看各个通道后,发现其蓝色通道有异常

(PS:图片是蓝色三通道,比较明显)

然后截取上面一条异常的色带

其大小为3000153,稍微观察一下(结果我观察了一整天X)可以看出来上面的图像有一定的规律,就算一对一对的三角形然后按大小和数量可以分成一个个的50 51的小正方形,于是脚本分解

#60格 * 3
from PIL import Image

bp = Image.open('1111.png').convert('L')
a,b = bp.size

aa = int(a//60)
bb = b//3

for i in range(3):#3
    for j in range(0,60,1):#60
        print(j)
        np = Image.new('L',(aa,bb))
        piece = bp.crop((aa*j,bb*i,aa*(j+1),bb*(i+1)))
        piece2 = piece.transpose(Image.FLIP_LEFT_RIGHT)
        # piece.show()
        # piece2.show()
        np.paste(piece,(0,0))
        np.paste(piece2,(aa,0))
        np.save('./piece/'+str(j+60*i)+'.png')

得到一堆可以识别出来的图片

然后本来想写个识别脚本。。然后发现常规的像素特征并不好找到,反正不多也就180个,竖向的是0,横向的是1,然后将其转化成字符即可得到flag

flag

ByteCTF{bwmTeam!}     .

发表评论

email
web

全部评论 (共 3 条评论)

    r00t
    2020-10-26 21:19
    神大人就是神
    123
    2020-10-26 21:15
    师傅np!!!
    2020-10-26 21:09
    师傅太强了!!!!!