在刷B站时看到有人在分享这个漏洞的原因,稍微琢磨了一下,脑袋告诉我:懂了,原来如此。但up主最后只给出了x64dbg中判断字符是否是空格的地方,没有给出定位过程,所以当时就来了兴趣,想自己分析分析。
话不多说,直接复现。
下载7.11版本,安装到默认目录:

在桌面新建CVE-2025-6218.bat,内容如下:
注意第3行的..后面有空格。
第3行的命令的意思是:
生成CVE-2025-6218.zip压缩包文件,并将POC.bat添加到进去,同时指明了POC.bat在压缩包里的路径,长这样:

执行CVE-2025-6218.bat:

会在桌面生成CVE-2025-6218.zip压缩包,右键解压到CVE-2025-6218,即意思是想在桌面生成CVE-2025-6218文件夹,但是结果却把POC.bat写入到了启动目录了:

再解压一遍,发生覆盖提示:

从给出的提示来看,路径里面的..后面没有空格了,路径也拼接好了,倒退两层就会变成:
之所以会解压到启动目录,是这样的:
右键解压到CVE-2025-6218,目标目录就是:
但是压缩时指定了路径:
所以两者拼接起来就是启动目录了。
从复现结果和覆盖提示能看出WinRAR拼接了路径,消除了空格,但是我不满足于此,想知道是在哪儿用什么方式处理的?是用strcpy还是memcpy、memmove?即我既想知道结果,也想知道过程。而网上的都是复现文章,没有过程分析文章,所以还是自食其力分析一下。
用ProcMon监控WinRAR.exe的文件行为,发现会往启动目录创建POC.bat文件,所以x64dbg拖入WinRAR.exe,对CreateFileW函数下断。(猜也猜得到是创建文件,所以可以不用ProcMon)
先取消CreateFileW断点(因为会频繁断下),运行起来,选中压缩包,进行解压:

出现下图覆盖提示界面时,这个时候启用断点,然后确认覆盖,就会断在我们想要的地方:

断下后,Ctrl+F9返回到上层,返回个两三次,就会来到下图的地方。全局变量0x00007FF6526F0F08里存放的就是目标路径字符串指针,而且目标字符串是拼接完成状态,而且其中的空格也被消除了:

再次解压,但不要进入覆盖提示界面(因为覆盖提示界面弹出时,已经把空格处理了,然后将处理好的路径展示给我们)。这个时候可以看到,全局变量里清0了,也就是说目标字符串指针还未写入:

对全局变量地址下硬件写入断点,然后点上图的【确定】按钮,中断后一直点运行,观察内存窗口,某一次就发现有字符串指针写入了,而且空格没有被处理,路径也还没拼接:

这个时候一直F8单步,运行到下图时,在读取全局指针变量了,应该要准备读取字符串进行处理了:

再继续单步,就会来到一个循环。
这里我跟了一下,循环会执行两轮,两轮后,字符串中的空格才会被处理,录制动图如下,一直按F9,两轮循环后,字符串中的空格被处理了,并且生成了最终的文件路径:

所以在第二轮循环快结束时,单步跟踪到这里,是这个call进行字符串处理:

那就跟进去看看,一直单步,遇到哪个call处理了路径,就进入。在下图会有一个循环,逐字符判断,关注对空格的判断即可:

如果是空格的话,就会调用call 0x00007FF65248A430进行处理:

看看里面是怎么处理的:

先是得到空格所在索引,通过索引截取到子字符串,地址赋值给RCX(开头是空格字符)。
然后子字符串偏移一个字符,即略过空格,地址赋值给RDX(开头是非空格字符)
继续单步到下图,关注框住的两行代码即可。
第一行:vmovdqu ymm1,yword ptr ds:[rdx+r9-A0],就是从RDX指向的字符串中读取32个字节,赋值给ymm1。
第二行:vmovdqu yword ptr ds:[rcx+r9-A0],ymm1,就是将读取的32个字节写入到RCX指向的地址中。

问了下AI,这是一组AVX(高级矢量扩展)指令集,进行数据移动,每次可移动32个字节。
分析到这里其实就清楚了,本质就是RCX指向的字符串,第一个字符是空格,而RDX经过加1处理,就绕过了空格,最后使用AVX指令,从RDX指向的字符串中读取32个字节,往RCX指向的地址进行写入,如此便把空格给消除了。简而言之就是往前移动数据。
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!