怎么浅析cve - 2021 - 1647的漏洞利用技巧

介绍

这期内容当中小编将会给大家带来有关怎么浅析cve - 2021 - 1647的漏洞利用技巧,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>概要

近期爆出的cve - 2021 - 1647是视窗防护MpEngine模块中的一处远端控制设备漏洞、下面旨在从漏洞利用层面对相关样本所使用的技巧进行分析,笔者使用的样本哈希为:6 e1e9fa0334d8f1f5d0e3a160ba65441f0656d1f1c99f8a9f1ae4b1b1bf7d788。

<强>漏洞原理

视窗防护采用模拟执行的策略,对可执行文件进行黑白判定,模拟执行分为以下两个层面:指令模拟和运行环境模拟。指令模拟部分负责将相应平台指令(包括手臂/x86/x64等)转为中间指令(IL),然后通过jit/解释执行的方式运行相应的中间指令,运行环境模拟则包括内存系统模拟/文件系统模拟/api模拟/DLL模拟(与MpEngine。dll同目录的vdm文件是dll模拟文件的压缩集/合),在指令模拟执行的过程中,碰到压缩壳的情况,后卫也会模拟解压过程(详见UnpackerContext::解包函数),当前后卫支持的压缩方式有:Upxw64/Upxw WExtract/NSPacker/收缩机/PECompact2/Area51/Crypter1337/Aspack/PKLite/SfxCab/Asprotect等。本次漏洞出现在Asprotect模拟解压过程中(CAsprotectDLLAndVersion: RetrieveVersionInfoAndCreateObjects函数):

怎么浅析cve - 2021 - 1647的漏洞利用技巧

上图中,v2 + 28代表一个段数组的开始,该数组包含四个元素,每个部分元素8字节,前4字节用于描述该部分的虚拟地址,后四个字节用于描述该节的大小,上图描述的是这样一个过程:遍历一个包含4项的节数组,最后获得一个sectionva和sectionsize,申请一片大小为sectionva + sectionsize的内存用于存储解压后的部分内容,但其在计算sectionva和sectionsize时存在错误,代码中只考虑了部分(i + 1) .va>部分[我]。弗吉尼亚州的情况,但并没有考虑两者相等的情况,倘若节数组中四个元素的值如下:(0,0),[0],[0 x2000, 0], [0 x2000, 0 x3000],按照上述代码的逻辑最终sectionva=0 x2000 sectionsize=0,那最终申请的内存大小为0 x2000 + 0=0 x2000,因此在解压最后一个部分时,由于其大小为0 x3000,这样便会产生堆溢出问题,这便是本漏洞的产生根源。

<>强利用技巧

<强> 1。确定版本偏移

在样本开头处调用了如下函数:

怎么浅析cve - 2021 - 1647的漏洞利用技巧

在刚开始分析该样本时,笔者以为该处地址是后卫中某个未开启本模块的地址或是类似于利用异常处理进行反调试的措施,但其实这时笔者犯了一个巨大的错误,要明确的一点是,当样本在被后卫模拟执行时,一切内存地址并不是真实的主机上的地址,而是后卫模拟内存空间中的一个地址,也就是说0 x7c96c654其实是后卫模拟内存空间中的一段地址,该地址其实对应于模拟dll模块,ntdll。dll(模拟的ntdll。dll可以通过解压与mpengine。dll同目录的mpasbase。vdm获得)中的一段代码:

怎么浅析cve - 2021 - 1647的漏洞利用技巧

注意看函数最后两个字节:0 xf 0 xff,这两个字节说明这是一个本机api调用,其后的四个字节0 x9e9efdf0是用于标识最终本机api函数的一个crc校验码,所谓的本机api即是有mpengine。dll提供的一系列功能api,最终该函数会由mpengine !NTDLL_DLL_NtControlChannel实现,也就是说样本中调用7 c96c654其实最终是调用mpengine !NTDLL_DLL_NtControlChannel完成功能,该函数第一个参数代表功能号,样本中的3代表的是获取后卫版本信息,样本就是通过该函数获取版本信息,然后根据不同的版本信息硬编码关键偏移。

<强> 2。内存占位/修改关键字段

在样本中包含了大量的SuspendThread和ResumeThread的调用代码,这部分代码其实是用来进行内存布局和占位的,在堆溢出发生后,会修改布局在堆内存后的lfind对象,lfind对象中的两个关键字段分别被修改为2 f9b和2 f9c(原始值为107 e和107 f),这两个字段在lfind_switch:: switch_in(在模拟执行ResumeThread函数时会触发该函数调用)函数中被引用:

怎么浅析cve - 2021 - 1647的漏洞利用技巧

上图中的v20即是会被引用的2 f9b和2 f9c,很明显由于被修改之后的值比正常的大,这会造成一个越界写的行为,上图中的* (v20 + * (v16 + 144)) |=3是漏洞利用过程的关键,该部分代码修改的是vmmcontrol中的一个关键字段,我们将在第三部分说明这个字段的用途。

怎么浅析cve - 2021 - 1647的漏洞利用技巧