cve-2020-0796_CVE20200796(下)

动态调试

在我们运行POC之前,首先使用windbg对srv2!Srv2DecompressData函数下好断点,时候运行系统,运行POC。程序段下来之后在
srvnet!SmbCompressionDecompress函数处下个断点,运行。

0c81d4d243922a26084ae898fa35dc9c.png

通过上一篇文章的静态分析我们知道了srvnet!SmbCompressionDecompress的参数如下所示:

efa433629cc6950b66f4f2e68d9ccbb6.png

1.压缩算法ecx1导致最后调用nt!RtlDecompressBufferLZNT1这个解压算法。
2.压缩数据的开始位置Compress_header_address+0x10+offsetrdx越界
3.压缩数据的长度Compress_packet_length-0x10-offsetr80x401Compress_packet_length为0x401运算时把offset当作-1
4.解压后的数据存放的位置分配内存后偏移0x18处存放的值+offsetr9越界
5.压缩数据的原始大小originalsizer140x400

从下图中我们可以看到,在压缩函数开始的位置参数二、参数四已经越界,解压后的数据的存放位置也越界了。

759509de594cf9d4c11356365e997fc5.png

接着进一步分析srvnet!SmbCompressionDecompress函数,返现最终通过调用RtlDecompressBuffer对数据进行解压。进入
RtlDecompressBuffer函数后发现根据压缩算法进入不同的解压函数。

b5e7f1144231de1e0e4d295bbf8e4251.png

ef3d313a3bbb3b536a3ad22c9b321a34.png

最终进入nt!RtlDecompressBufferLZNT1函数中

0f6bbfa9398a99459781a4c254ed82a2.png

1ad91b8076bdecbc4012e8c0388b1cdf.png

根据前面的分析我们知道在下图的nt!RtlDecompressBufferLZNT1+0x57的位置会发生错误,错误如下图所示。

ec16bf1c0e8666096f8c931751d370ad.png

rsi是0x00000001406E8D75位置的r8传入,而r8则是Compress_header_address+0x10+offset,所以存在越界错误。

bd977041dacb3800ad67ea9af04747c4.png

08a6f4ae26c64bbdc9caf2f7b6d5ec9d.png

从上图中我们可以看到在nt!RtlDecompressBufferLZNT1对数据进行压缩的时候,读取第一个值时发生了越界读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值