**

CVE-2021-1647

**
概要
CVE-2021-167是微软系统中自带的杀毒软件,该漏洞在野利用被安全厂商发现并进行通报。本文是对样本所使用的技巧进行分析。笔者分析的样本MD5值为:db0e53c9db41d4de21f4bbf1f60d977f5d935239d3fce8b902e8ef0082796cc7

漏洞原理
Windows Defender采用模拟执行的策略,对可执行文件进行黑白判定,模拟执行总共分为两个层面,一是指令模拟,二是运行环境模拟。
每个厂商的杀毒程序都会有自己的平台中间指令,指令模拟部分负责将相应平台指令(包括 arm/x86/x64等)转为中间指令(IL),然后通过自己平台的jit/ 解释执行的方式运行相应的中间指令。运行环境模拟则包括内存系统模拟/文件系统模拟/api模拟/DLL模拟。
如果杀软在指令模拟执行的过程中,遇到一些市场上常用的压缩壳子怎么办?
当然,杀毒软件也会模拟执行解压过程,内置一些解壳方式。当前 defender 支持的压缩方式有:Upxw64/Upxw/WExtract/NSPacker/Shrinker/PECompact2/Area51/Crypter1337/Aspack/PKLite/SfxCab/Asprotect 等。
本次漏洞出现在 Asprotect 模拟解压过程中(CAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects 函数):由上图可知,v2+28是一个section数组的开始,数组中每一个元素总有8个字节,其中前4个字节用于描述该数组的虚拟地址,后4字用于描述该数组的大小。
上图描述的是这样一个过程:遍历一个包含 4 项的 section 数组,最后获得一个 sectionva 和 sectionsize,申请一片大小为 sectionva+sectionsize 的内存用于存储解压后的 section 内容,但其在计算 sectionva 和 sectionsize 时存在错误,代码中只考虑了 section[i+1].va>section[i].va 的情况,但并没有考虑两者相等的情况,倘若 section 数组中四个元素的值如下:[0,0],[0,0],[0x2000,0],[0x2000,0x3000],按照上述代码的逻辑最终 sectionva=0x2000,sectionsize=0,那最终申请的内存大小为 0x2000+0=0x2000,因此在解压最后一个 section 时,由于其大小为 0x3000,这样便会产生堆溢出问题,这便是本漏洞的产生根源。

**

样本利用方式

**
1、确定Defender版本

通过解压与 mpengine.dll 同目录的 mpasbase.vdm获得的ntdll.dll_module746.dll进行分析

由上图可知,该内存地址后面两个字节为0XOF和OXFF,说明这两个字节是native api的函数调用,在其随后的0xF0 0xFD 0x9E 0x9E 0x93 0xC2 0x08 0x00是native api函数的CRC校验码。
为此由上诉分析可知,样本中call 7C96C654 其实最终是调用 mpengine!NTDLL_DLL_NtControlChannel 完成功能,该函数第一个参数代表功能号,样本中的 3 代表的是获取 defender 版本信息,样本就是通过该函数获取版本信息,然后根据不同的版本信息硬编码关键偏移。

2、内存占坑/修改关键字段
在此样本中,循环调用大量SuspendThread 函数和 ResumeThread函数,进行内存布局与内存占坑,一旦堆溢出发生后,会修改布局在堆内存后的 lfind 对象为 2f9b 和 2f9c


其中漏洞点存在于:

由上图的漏洞点可知,该部分代码修改的是 vmmcontrol 中的一个关键字段。

3、在Defender中寻找任意读写的手段
首先我们得认识在Defender中的一个结构体

这个结构体是用于维持虚拟地址与真实地址间的映射关系。一般该结构体在内存中都是以数组的形式存在。
为了实现高效的地址转换,defender 还引入了一个索引数组(每个索引用 2 字节存储),该数组中存储的是 EmuVaddrNode 结构数组的索引,并且是按照 EmuPagenum 从小到大进行排序的,也就是说假设此时 EmuVaddrNode 数组中包含三个元素,且三个元素的 EmuPageNum 字段内容为 0x2000,0x1000,0x5000,那么正常情况下此时索引数组内容为1,0,3(1、0、3 都代表 EmuVaddrNode 数组的索引),并且 EmuVaddrNode 数组和索引数组在真实内存中的布局如下(假设从左到右代表地址从低到高)

也就是说,索引数组后头就是 EmuVaddrNode 数组,EmuVaddrNode 数组紧跟着的是 Page,Page 代表的是 defender 申请的用于映射模拟内存空间的真实内存,即 EmuVaddrNode 中的 Vaddr 都是从 page 中切割出来的。最后,我们回顾一下第二部分中提到的修改了 vmmcontrol 中的关键字段,这个关键字段描述的是索引数组一共有多少个元素。如果我们将该数值改的尽可能的大,使得索引数组的起始地址+索引数组数目*2>Page 地址,而 Page 中的内容是我们可控的,我们通过让 defender 模拟执行 *p=value 的方式,就能在 Page 中布置我们想要的内容。首先,我们在 Page 中伪造索引数组,并且该索引远大于 EmuVaddrNode 数组的项数,那么当 defender 模拟执行 *p=value 这类指令时,先是从我们在 Page 中伪造的索引数组中取到一个伪造的索引(该索引远大于 EmuVaddrNode 数组的项数);接着,我们在 Page 中继续伪造一个 EmuVaddrNode 结构,那么 defender 通过伪造的索引便会访问到我们在 Page 中伪造的 EmuVaddrNode 结构,这时 EmuVaddrNode 结构的 Vaddr 是我们可控的,那么我们便获得了任意地址读写能力,“写”通过让 defender 模拟执行 *p=value 来实现,“读”通过让 dfender 模拟执行 value=*p 来实现。有浏览器或者内核漏洞相关经验的同事应该很熟悉这种场景,通过修改长度字段来伪造对象及其 pointer 字段最终获得任意地址读写的能力。

由上图所知,该样本在先遍历索引数组找到EmuVaddrNode 数组后再寻找Page的地址,最后计算出jit的地址的偏移量并保存.

4、代码执行




由步骤三找到page的地址后,向其写入shellcode,类似于使用memcpy向jit 地址写入了 shellcode,当模拟指令执行后shellcode就会执行。

本文是站在巨人的肩旁上对该样本进行分析,原文作者中还给出类似样本的检测方案,详情请转到:https://www.anquanke.com/post/id/231625

CVE-2021-1647样本分析相关推荐

  1. 2021年第一季度Sumap网络空间测绘CVE漏洞趋势安全分析报告

    前言 本文主要通过网络测绘角度收集各种资产协议的版本号信息,通过比对CVE漏洞影响范围中的版本号方式,进行安全风险趋势分析,无任何实际危害互联网行为.资产在携带版本中也会存在修复补丁后版本不变的情况. ...

  2. 新变种Emotet恶意样本分析

    样本信息 表1.1 样本信息表 文件 1.doc 大小  190976 字节 修改时间  2021年12月2日, 10:30:02 MD5 2EFBE18F2ED8AE0D4648B68596DFA0 ...

  3. R语言回归模型构建、回归模型基本假设(正态性、线性、独立性、方差齐性)、回归模型诊断、car包诊断回归模型、特殊观察样本分析、数据变换、模型比较、特征筛选、交叉验证、预测变量相对重要度

    R语言回归模型构建.回归模型基本假设(正态性.线性.独立性.方差齐性).回归模型诊断.car包诊断回归模型.特殊观察样本分析.数据变换.模型比较.特征筛选.交叉验证.预测变量相对重要度 目录

  4. CVE-2010-2883 从漏洞分析到样本分析

    本文章将从漏洞利用分析开始,到样本分析结束,其中涉及到的知识点有PDF格式.TTF字体格式.缓冲区溢出漏洞利用.PE文件格式.软件脱壳和恶意代码分析.其中会演示一些基本操作,方便初学者进行复现. 前置 ...

  5. Android版本的Wannacry文件加密病毒样本分析(附带锁机)

    一.前言 之前一个Wannacry病毒样本在PC端肆意了很久,就是RSA加密文件,勒索钱财.不给钱就删除.但是现在移动设备如此之多,就有一些不法分子想把这个病毒扩散到移动设备了,这几天一个哥们给了一个 ...

  6. [系统安全] 三十一.恶意代码检测(1)恶意代码攻击溯源及恶意样本分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. 深入解读Gartner 2021年《分析与BI平台魔力象限》

    近日,Gartner发布了2021年度的分析与商业智能平台魔力象限报告.作为业内的权威报告,魔力象限在分析与BI平台(以下简称ABI平台)供应商和用户中受到了非常广泛的关注,可以说是行业风向标.帆软数 ...

  8. APT样本分析 -plugx家族RAT⽊⻢

    APT样本分析 - plugx家族RAT⽊⻢ ⼀.样本概述 样 本 从 海 莲 花 服 务 器 扒 下 来 的 ( 经 提 醒 修 改 , 原 先 错 误 归 类 为 海 莲 花 ) , wsc_pr ...

  9. incaformat蠕虫病毒样本分析及查杀防范措施

    2021incaseformat蠕虫病毒 一.病毒简介 二.样本分析 三.查杀与恢复方式 四.预防措施 一.病毒简介 病毒名称:incaseformat 病毒性质:蠕虫病毒 影响范围:windows ...

  10. 2021用户行为分析领域最具商业合作价值企业盘点

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 6月19日,数据猿携手上海大数据联盟,依托双方优势资源与力量,共同以媒体+联盟的方式推动产业的发展与行业的进步,特以"聚焦数智价值 引领 ...

最新文章

  1. Swift 字面量表达
  2. scrollBy与scrollTo的区别与用法
  3. java double add,Java中的DoubleStream.Builder add()方法
  4. 基于python的科技论文_实地科研 | 上海财经大学 | 金融科技、商业分析、人工智能:机器学习、人工智能及其在金融科技中的应用(2021.1.25开课)...
  5. python paramiko exec_command()和invoke_shell()
  6. 使用Maven命令安装jar包到repo中
  7. 电商促销活动那么多,美工需要炫酷海报万能模板!可套用!救急必备!
  8. 单向链表和双向链表区别_双向链表
  9. Unity编辑器:自定义编辑器样式——GUIStyle
  10. 自动化的人肉搜索引擎即将出现?
  11. WIN7 KB4516065 安装失败
  12. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分
  13. tensortAPI的learning
  14. FITC-Dextran,Dextran-FITC,右旋糖酐荧光素,一种被标记的多糖
  15. 调整物料的存货科目代码,会不会造成存货系统和总账对账不平?
  16. ios 其他 清理不了_iOS/Android都无法回避的一件事儿:是它们让手机越来越好用...
  17. Python——dat文件批量合并为同一个csv文件
  18. 忘记开机密码怎么开机
  19. 非相干散射雷达数据(ISR)及电离层GNSS-TEC数据下载(madrigal数据库)
  20. Python编程 环境搭建

热门文章

  1. laravel+容联.云通讯 实现手机短信验证用户注册
  2. 2023安徽大学计算机考研信息汇总
  3. 国家基金申请书撰写的共性问题(转)
  4. 使用DGL实现基于闲鱼图进行边分类算法
  5. 边缘计算与通信的深度融合
  6. NYOJ 427 Number Sequence
  7. docker mysql volum_Docker --volume(数据持久化)
  8. 电脑最大支持的内存是多少
  9. python输出玫瑰花
  10. AR与VR开发实战pdf