第二届网鼎杯Misc-虚幻2wp


这道题当时比赛的时候确实没太想出来,现在来复盘一下

  • 题目描述

upload successful

  • 解题过程

题目下载下来是一个叫file的文件,用010打开看看

upload successful
PNG格式开头,很明显是张图片,换成.png再打开

upload successful
很奇怪的一个图像,并且大小是36x12

当时第一时间想的是用stegsolve去看图层有没有什么东西,但是都没找到


后来有师傅翻到了2018年网鼎杯的虚幻1,结合一下题目的介绍,发现当年是汉信码,那么估计这次也是要搞成汉信码了

接下来就是怎么搞出来的问题了,第一个问题就是图片的大小

汉信码必然得是正方形,但是图片的宽比高大了三倍

3这个数字,那就联想到rgb三个图层了

当时比赛时的想法是把R G B三个图层的分别取出来然后拼,但是并不能拼出个大概,于是就卡住了233333

后来看见别的师傅的做法,真正的理解应该是:

一张图片的每个像素点的R G B值为0-255的某个值

我们取出每个点的R G B值,这样原来的36x12个点就会变为3倍的值

接着因为汉信码为黑白两色,我们再把原来为255的值变为1,0的值变为0,最后再转换回图片,就能得到一张36x36的图片了

附上脚本

from PIL import Image

im = Image.open('file.png')
s = ""
pix = im.load()
width = im.size[0]
height = im.size[1]
for x in range(width):
    for y in range(height):
        r, g, b = pix[x, y]
        if (r == 255):
            s += "1"
        else:
            s += "0"
        if (g == 255):
            s += "1"
        else:
            s += "0"
        if (b == 255):
            s += "1"
        else:
            s += "0"

MAX = 36
pic = Image.new("RGB",(MAX,MAX))
i=0
for y in range(0,MAX):
    for x in range(0,MAX):
        if(s[i] == '1'):
            pic.putpixel([x,y],(255,255,255))
        else:pic.putpixel([x,y],(0,0,0))
        i = i+1
pic.show()
pic.save("flag.png")

利用这个脚本,我们可以得到一张flag.png的图片

upload successful
但其实仔细观察的话,这张图片和标准的汉信码比较一下

upload successful
结合给出的Hint图片要转和暴力修补,那么我们应该需要先转动图片,再修复空白区域

经过旋转和改变角落的定位点后

upload successful
我们还剩下右边一块空白,结合汉信码的纠错,我们只要用画图涂上几笔就能识别啦

upload successful

ps:我当时是随便涂了几笔,不过第二次好像又不行了,不是很懂原理233333


文章作者: peco
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 peco !
  目录