参考文章:
汉信码识读技术研究
2020网鼎AreUSerialz、虚幻2 | BTIS’s blog
图片很小,没有隐藏信息,PS打开:
每个像素点的RGB的三个通道都是255/0:
红R色通道:
绿G通道:
蓝B通道:
像二维码,但拼接之后啥都没有。处理思路:
-
分通道按行拼接,读的时候是
B-G-R
,拼接的时候是R-G-B
,图像且大小为36*36
-
注意看G通道,上下沿的两边都是长黑线,一般是二维码的边沿
-
而我们还观察到到一般二维码的四角都会有空白的一行,但最两边是黑色:
-
观察到R通道对应像素行是白色的:
-
而B通道符合二维码的特征,所以把它放在G后面
-
结合经验,那么就可以发现
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的转换
-
-
这时候我们确认这是个汉信码,但是发现校正折线位置不对,正常的:
-
加上图像反转
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')
-
左下定位码也反了,将左下定位码反转180度
import cv2import numpy as npfrom PIL import Imageimg=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度
-
放进
http://www.efittech.com/hxdec.html
或用中国编码APP都读不出来,题目中提示暴力修补,而汉信码设计是有纠错能力的,一般使用要选择L2及以上的纠错等级: -
L2的纠错容量可达到15%,足够用了我们随便在那块空白的地方划两下哈哈:
- 也可以专业一点:补全辅助矫正位,并另填一个像素点辅助汉信码识别系统识别辅助矫正位:
image1[17,33],image1[15,31]=0,0
- 都可以扫得到flag
flag{eed70c7d-e530-49ba-ad45-80fdb7872e0a}