Posted on

前言:我在CTF中二维码题目及答题技巧总结(一)中简单描述了QR Code的种类、版本、编码方式等基础知识,本文主要讲解我在CTF的QR Code类题目时用到的小技巧,纯属个人经验总结。阅读本文前需掌握Photoshop软件的基本操作、Python基础以及总结(一)中提到的QR Code基础知识。

1. Photoshop在二维码题目中的常用功能

新建参考线版面(New Guide Layout):在视图菜单中可以找到该功能,使用该功能可以快速新建制定行数列数与间距的参考线,为特定版本的QR Code生成矩阵模板。

阈值(Threshold):在图像-调整中可以找到,不过建议通过调整图层进行阈值调整操作。该功能可以快速将二维码图片进行二值化处理,即得到只有黑白两个颜色的图片,可以快速除去二维码图片中的杂色。

反相(Invert):与阈值功能使用方法相似,可以将图像中的所有颜色进行反相处理。有些题目需要对二维码部分图案进行反相处理得到可以扫描的二维码。

其他功能:各种选择工具、移动、变形、蒙版等基础功能,在此不再赘述。

2. 二维码题目总结

2.1 裁剪拼接

        裁剪拼接类题目有明显的特征,即二维码被撕碎或通过图像处理软件裁剪、部分旋转等造成无法通过二维码识别软件直接进行识别。此类题目主要考察二维码结构等基础知识和使用图像处理软件对图片进行拼接的能力。解题步骤大致为:二维码类型识别、碎片的选取及拼接。

        上图为一张二维码碎片,根据该图片基本特征可以判断其编码方式为QR Code。根据QR Code的定位图案(Finder Pattern)和对其图案(Alignment Pattern)可以初步判断这几张碎片的位置和顺序没有被打乱。因此,仅需要对其进行拼接处理。通过计数这些碎片的码元数为29*29,即版本(Version)为3。在Photoshop中新建一个正方形文件,并建立29*29的参考线面板。通过套索或其他工具将题目中的二维码碎片选取并逐一复制到新的文件。对各个图层进行变形后得到可以解码的二维码图形。操作过程如下:

2.2 污损补全

        无损补全类题目可以有多种形式,比如印有二维码的破碎的饼干、烧掉一部分的印有二维码的纸、被遮挡部分图案的二维码等。此类题目通常只无损数据区或容错区其中一部分的数据内容,正常的解题步骤为根据编码区格式信息手动去除掩码(Mask),读取二维码中每个码元的数据并根据QR Code的编码规则进行手动解码操作,得到二维码内容(推荐阅读:http://ppwwyyxx.com/2014/QR-Puzzles/)。此处仅对Photoshop在解答此类题目的技巧进行描述。由于QR Code强大的容错性,解码软件可以在部分码元破损或错误的情况下进行二维码解码,因此可以通过Photoshop的阈值,使无损部分处于黑白颜色的过渡位置,扫码软件可以在部分正确的情况下得到二维码内容。

        以上面的来自南安普顿大学主办的英国高校网络安全挑战赛的题目为例。这是一道高分题目,其考察内容为QR Code的基础结构,需要手动去除掩码并手动解码数据得到答案。但是此处利用Photoshop的技巧,补全定位图案、对齐图案等固定结构后,通过阈值功能,使图像中的红色遮挡处于黑-白的临界值,由于QR Code强大的容错性,可以在部分码元正确的情况下得到答案。过程如下:

2.3 批量解码

        此类题目会提供大量的二维码,需要通过程序批量读取信息并处理得到答案。推荐使用Python进行批量解码处理。Python环境中对QR Code解码依赖zbar、PIL(Pillow)模块。使用PIL的Image加载图片文件并使用pyzbar的decode进行解码。使用示例如下:

from pyzbar.pyzbar import decode
from PIL import Image
def QRdecode(filepath):
     result = decode(Image.open(filepath))
     return result[0].data
if name == "main":
     print(QRdecode("Desktop\qr.png"))

3.总结

        二维码题目种类较多,不仅限于QR Code,也可能使用了其他编码形式。但无论哪种形式,都需要对二维码编码原理有初步了解。通常可以使用图像处理软件进行图像的修复,若掌握一些小技巧,使用出题人想不到的方式得到答案,可以实现事半功倍的效果。

        最后,给大家推荐一个手机扫码的APP:CortexScan(前同事康师傅推荐给我的),支持数十种编码方式,可以很快地识别出扭曲或低反差的各种条码。

发表回复