[网鼎杯 2020 青龙组]虚幻2 详解 (python脚本)

参考文章:

汉信码识读技术研究

2020网鼎AreUSerialz、虚幻2 | BTIS’s blog

图片很小,没有隐藏信息,PS打开:

每个像素点的RGB的三个通道都是255/0:

红R色通道:

绿G通道:

蓝B通道:

像二维码,但拼接之后啥都没有。处理思路:

  1. 分通道按行拼接,读的时候是 B-G-R,拼接的时候是 R-G-B,图像且大小为36*36

    • 注意看G通道,上下沿的两边都是长黑线,一般是二维码的边沿

    • 而我们还观察到到一般二维码的四角都会有空白的一行,但最两边是黑色:


    • 观察到R通道对应像素行是白色的:

    • 而B通道符合二维码的特征,所以把它放在G后面

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NenOk0GV-1648263350723)(CTF.assets/image-20220326102541858.png)]

    • 结合经验,那么就可以发现R-G-B 可以拼出二维码

    import cv2
    import numpy as np
    from PIL import Image
    img=cv2.imread('file.png')
    image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36) #RGB
    Image.fromarray(image1).save('res.png')
    
    • cv2.imread读文件,读出来是个三维数组(numpy.ndarray)3(B:G:R)*36(列数)*12(行数)

    • img[:,:,0] 抽出B通道:(B)*36(列数)*12(行数)

    • np.hstack 依次读取每个通道数组的行,连在一起:(36+36+36)*12

    • reshape(36,36) 分割最低位维,分割后的数组规格为:36*36

      • 分割过程大致就是砍断长的一维向量,把截出来的向量直接紧挨着放到下面(不理解的话可以自己尝试或者上网查询)
    • Image.fromarray 实现ndarray到image的转换

  2. 这时候我们确认这是个汉信码,但是发现校正折线位置不对,正常的:

  3. 加上图像反转

    import cv2
    import numpy as np
    from PIL import Image
    img=cv2.imread('file.png')
    image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36) #RGB
    image1=np.flipud(image1)
    Image.fromarray(image1).save('res.png')
    

  4. 左下定位码也反了,将左下定位码反转180度

     import cv2
     import numpy as np
     from PIL import Image
     img=cv2.imread('file.png')
     image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36)
     image1=np.flipud(image1)
     image1[24:33,3:10]=np.rot90(image1[24:33,3:10],2)
     Image.fromarray(image1).save('res.png')
    
    • rot90(array,2)将数组旋转180度
      在这里插入图片描述
  5. 放进http://www.efittech.com/hxdec.html或用中国编码APP都读不出来,题目中提示暴力修补,而汉信码设计是有纠错能力的,一般使用要选择L2及以上的纠错等级:

  6. L2的纠错容量可达到15%,足够用了我们随便在那块空白的地方划两下哈哈:

  1. 也可以专业一点:补全辅助矫正位,并另填一个像素点辅助汉信码识别系统识别辅助矫正位:

在这里插入图片描述

image1[17,33],image1[15,31]=0,0

  1. 都可以扫得到flag
flag{eed70c7d-e530-49ba-ad45-80fdb7872e0a}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值