2024矩阵杯wp 两级反转

2024矩阵杯wp 两级反转

M1aoo0bin

。:.゚ヽ(*´∀`)ノ゚.:。

两级反转

两极反转,黑白不分
奇变偶不变,横变竖不变
(PS:或许你要非常熟悉二维码的结构

write up

光看提示大概可以猜到是奇数的横行颜色黑白反转了
但是有个问题是index是从0还是1开始计数呢?都很合理啊
而且位置探测的三个方块很明显是正确的,那就是处理图像是要跳过这些正确的部分(?

0

没关系,还有一条PS:让我熟悉二维码结构

img

对照一下我们的图片,初见端倪啊。

img_1

红框一列的地方黑白是固定的,奇偶的问题解决了;
图像处理的范围其实不能完全确定,不是整张图是肯定的,但具体一定要多少呢?其实没有足够明确的证据来佐证
但是没关系,二维码图形本身有很好的反混淆,我们既是没有完全复原依旧可以尝试能不能读出信息

先复原红框的部分
拿上次的RCTF脚本略略修改一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

def split4db(img, offset_x=1, offset_y=1, flag=0):
# 跳过外围白边
img = img[offset_y:, offset_x:]
p = 0

# 先切x
for i in range(29):
p += 25
if i<7 or i>21:
continue
else:
if i%2==0:
img[p-25:p+1,:]=cv2.bitwise_not(img[p-25:p+1,:])


return img

img=cv2.imread("8E2A248B-0EE8-42b2-B19B-C6A9CE0D47F8.png")
img=split4db(img)
cv2.imwrite('new0.png', img)

结果:
new0
扫一下,出了。

后记

有关为什么这个结果这么丑陋:

实际上,这张二维码的图片如果拖进画图等可以数像素的软件里人力分析一下,很容易发现,它是25像素对齐的,也就是一个黑点或白点理论上是25*25像素。
然而,黑色并不完全遵循这个25对齐,只有当有另一个黑点和它接壤时,他才会在连接处满足25个像素对齐,否则就是24个黑色像素加上一行或一列多余的白色像素。
一开始我的确想要处理掉这些像素,方案为统统改为24像素对齐,但是写到一半的时候考虑到二维码有很好的反混淆性,说实话1对于24来说就是一个很小的噪声,所以就忽略不计了,把最外围的1像素白边切掉后直接处理图像就ok了。

有关二维码有很好的反混淆性:

这实际上是一个很有意思的知识,二维码是有自己的版本以及纠错级别的,每个二维码出生的时候就被选择了能承载多少的什么形式的信息,但是具体的就不说了,网上有非常多讲这块讲的很清楚的。
img_2
可以看到,如果我想要容纳更多的噪声(纠错能力变强),那么能够实际留存的有效信息越少,很符合直觉。
img_3

  • Title: 2024矩阵杯wp 两级反转
  • Author: M1aoo0bin
  • Created at : 2024-06-19 05:59:47
  • Updated at : 2024-09-03 21:08:18
  • Link: https://redefine.ohevan.com/2024/06/19/2024矩阵杯wp-两级反转/
  • License: This work is licensed under CC BY-NC-SA 4.0.