您现在的位置是:娱乐 >>正文

ctf二维码修复

娱乐1人已围观

简介去年打某CTF线上赛,遇到一道二维码题,扫出来是乱码。当时第一反应是拿手机硬扫,结果识别失败。扔进QR Research,解码出来一串二进制,看着像被翻转了某些模块。这类题在CTF里不算少见,但每次碰 ...

去年打某CTF线上赛,码修遇到一道二维码题,码修扫出来是码修乱码。当时第一反应是码修拿手机硬扫,结果识别失败。码修扔进QR Research,码修解码出来一串二进制,码修看着像被翻转了某些模块。码修这类题在CTF里不算少见,码修但每次碰到都得花时间磨。码修

二维码本质上就是码修个矩阵,每个黑白块对应一个bit。码修标准QR码有40个版本,码修版本越高矩阵越大,码修纠错能力也越强。码修出题人最喜欢干的事就是在纠错码上做手脚——要么把纠错等级改掉,要么直接翻转几个数据模块,让你扫不出来但又能通过某种方式还原。

我习惯先用zbar扫一遍。命令行下zbarimg code.png,能出结果就说明二维码本身没被破坏,只是内容被加密或者编码了。扫不出来才进入修复流程。

定位图案是突破口

QR码三个角上有回字形定位图案,这三个图案几乎不会被改动,因为改了解码器直接找不到码的位置。修复的第一步就是确认这三个定位图案是否完整。用Python的OpenCV或者PIL把图片读进来,裁出三个角的小块,肉眼比对标准模板。

有一次遇到的情况是定位图案被人为缩小了一圈,导致解码器定位偏移。这种就得手动重建定位图案——按标准比例画回去。标准定位图案是7×7模块,外圈黑色,中间白色,核心3×3黑色。

import cv2 img = cv2.imread('qr.png', 0) # 二值化 _, bw = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 检测定位图案 detector = cv2.QRCodeDetector() data, points, _ = detector.detectAndDecode(bw) print(points)

如果points返回空,说明定位图案被破坏了,得手动找。

纠错码不是万能的

QR码的纠错能力分L/M/Q/H四级,分别能恢复约7%、15%、25%、30%的损坏数据。很多人以为开了H级就随便改,实际上纠错码本身也是数据,你改多了照样解不出来。CTF题里常见的套路是把纠错等级从H改成L,然后把数据区涂掉一大块,逼你用Reed-Solomon算法手动恢复。

Reed-Solomon解码可以用Python的reedsolo库。先把二维码矩阵按标准提取成码字序列,然后丢进去纠错。这步比较繁琐,因为要处理掩码、格式信息、版本信息。偷懒的办法是用qrcode库的底层接口,或者直接上pyzbar配合手动修图。

掩码和格式信息

格式信息藏在定位图案旁边,15个bit,包含纠错等级和掩码模式。掩码模式有8种,每种对应一个异或公式。出题人有时候不改数据,只把掩码模式改掉,这样解码器用错误的掩码去还原,得到的就是乱码。

修复方法是把格式信息读出来,手动算出正确的掩码,重新异或一遍数据区。格式信息本身也有BCH纠错,15bit里只有5bit是有效数据,剩下10bit是纠错码。用查表法最快,标准文档里都有。

我一般写个小脚本,把格式信息提取出来,暴力枚举32种可能,看哪种能让数据区的纠错码通过。过了就说明掩码对了。

实际案例

上个月有道题,二维码图片被加了一圈白边,然后整体旋转了3度。zbar直接跪。我先用OpenCV做透视变换,把三个定位图案的中心点找出来,映射回标准正方形。旋转角度小的时候,其实用cv2.minAreaRect就能矫正。矫正完再二值化,zbar就认了。

还有一次更离谱,出题人把二维码的每个模块从1×1像素放大到10×10像素,然后在每个模块内部画了个小十字。这种属于视觉干扰,二值化的时候用均值滤波先糊一下,再阈值处理,十字就没了。

修复二维码这事,核心就一句话:先保证定位图案和格式信息正确,再处理数据区和纠错码。顺序反了会浪费很多时间。工具链方面,zbar、OpenCV、reedsolo、qrcode这四个库够用了。剩下的就是耐心,一个模块一个模块地看。

Tags:

上一篇:保密公安网站

下一篇:iis部署网站步骤

相关文章

  • qq快速解冻神器电脑版

    娱乐

    QQ账号被冻结,密码找回流程跑不通,申诉通道卡在“证据不足”上——这种时候,网上流传的“快速解冻神器”就成了不少人病急乱投医的对象。我亲眼见过同事小周的经历,他账号被盗后被人拿去发了赌博广告,冻结通知 ...

    【娱乐】

    阅读更多
  • 易语言取网页文本内容

    娱乐

    易语言取网页文本内容,说白了就是让程序把网页上那些文字扒下来。别急着写代码,先想清楚一件事:网页不是一张白纸,它是HTML标签堆出来的结构。你要的是文字,但程序看到的是标签、属性、脚本,全混在一起。 ...

    【娱乐】

    阅读更多
  • Web服务器目录遍历任意文件访问

    娱乐

    一个配置不当的Nginx,能把整个服务器的文件系统变成裸奔的档案室。这不是危言耸听,而是我上周在测试某政府网站时亲眼所见——对方只是少写了一行autoindex off;,我就顺着URL路径/uplo ...

    【娱乐】

    阅读更多


友情链接