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

image-20201025224410634

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中发现各个颜色最低位有二维码的印记ByteDance.png_Blue_0

ByteDance.png_Green_0

ByteDance.png_Red_0

因为一开始没什么想法,于是便去找了找原图,发现原图在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:

r

g.png:

image-20201025210413511

b.png:

g

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

image-20201024173306908

得到image-20201024173336055

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

2

11

33

拼接后得到:

未标题-1

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

于是用qrazybox手撸二维码:

image-20201024173941454

解码发现:

image-20201024174021298

使用另外一个工具:

image-20201024174055355

得到flag:

image-20201024174124488

flag

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

Hardcore Watermark 02

Description

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

hint:分块隐藏

Analyze

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

emb.jpg

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

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

1

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

1111

其大小为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')

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

image-20201025200217116

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

image-20201025200615471

flag

ByteCTF{bwmTeam!}     .