由一道题看修复分析&原理

起因是BUU的一道题,binwalk分离出半张二维码。

00000087

我开始以为是图下隐藏了另一张图,但是png和jpg都是没有办法保存图层文件的。遂求助群友,某大佬甩出来郁离歌大佬的wp,是安恒的某次月赛题,这种题目应该还是在某段时间流行过。

首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。

这道题是29×29的,也就是Version 3。更加具体的二维码可以参看下面参考文章,在此不多做赘述。

我们做这道题需要了解到的就是二维码分了很多的区域存储不同的信息,保存写入数据的只有一小部分,所以我们修复残损二维码的时候只要得到数据码就可以了。

功能性数据
  • Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。
  • Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。
数据码和纠错码
  • 除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。

数据编码

二维码中最常见的就是QR码,支持数字编码字符编码字节编码日文编码

具体的编码分析示例还是参看下面参考文章。

纠错码

二维码有四种纠错级别,这也是为什么微信这些二维码中间会放一个个人头像的原因,因为普通的残损会被修正。

错误修正容量
L水平 7%的字码可被修正
M水平 15%的字码可被修正
Q水平 25%的字码可被修正
H水平 30%的字码可被修正

最终编码

最终编码会将数据码和纠错码交替排列

跳过这些我们直接开始画图

确认Version级别之后再画定位点,这没什么可说的

我们可以使用工具网站进行手动修补,会比较方便

1

然后是Formation Information,也就是存放格式化信息的部分。

2

Version Information是版本7之后才需要的数据块,所以我们在此不做讨论。

接下来把我们要把已知的数据块填入

3

这个时候注意到未填的地方是灰色的,缺失字节数100%

4

把灰色的地方填为白色,可以使用油漆桶工具

5

Tools→Extract QR Information

缺失字节数0%

Flag{OQWIC_4DS1A_S034S}

6

自己仿照着设计了一道题,有空的师傅可以试试玩一下

MISC-1-夏师傅的秘密


参考文章:
2018安恒三月月赛-WRITE-IP

SECCON CTF 2014: QR (Easy) Write-up
Write-up of SECCON CTF 2014: QR (Easy).
二维码的生成细节和原理