Loading
1

暴风影音AviIndexChunk字段堆溢出漏洞分析实战

F10跳过执行,得到申请后堆的地址:
0:044> peax=01d37cd8 ebx=00000000 ecx=00000008 edx=01ca0048 esi=01ce0ac0 edi=00000270
eip=67953043 esp=0b37f338 ebp=0b37f38c iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206
AviSplitter+0x3043:
67953043 8986d4000000    mov     dword ptr [esi+0D4h],eax ds:002b:01ce0b94=00000000
查看实际环境下的堆的详细信息:
0:044> !heap -p -a eax
address 01d37cd8 found in _HEAP @ 1de0000
HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
01d37cd0 0002 0000  [00]   01d37cd8    00008 - (busy)
查看堆的内存布局信息:
0:044>  !heap -x eax
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
01d37cd0  01d37cd8  01de0000  01d39b60        10      -           8  LFH;busy
由此可知,实际环境中,申请的该堆为0×10字节的LFH低碎片堆,该堆的入口为eax之前8个字节,查看堆入口处的内存布局:
0:044> dd 01d37cd0
01d37cd0  38c97823 88000001 01de0038 80004656
01d37ce0  38c97825 8c000001 b30518eb 00000069
01d37cf0  38c97827 80000000 01d1003a 00000000
01d37d00  38c97819 80000000 38c9003c 80000000
……
在实际环境中,溢出4个字节的话,应该是eax+8=01d37ce0处,在此处下内存写断点:
0:044> ba w4 01d37ce0
0:044> g
Breakpoint 1 hit
eax=44434241 ebx=00000000 ecx=00000001 edx=00000000 esi=0bb85d4e edi=01d37ce0
eip=69ed1fdc esp=0b37f2c8 ebp=0b37f2d0 iopl=0         nv up ei ng nz ac pe cy
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000297
MSVCR100!memcpy+0x15c:
69ed1fdc 8d048d00000000  lea     eax,[ecx*4]
查看附近指令:
69ed1fd4 8b448efc        mov     eax,dword ptr [esi+ecx*4-4]
69ed1fd8 89448ffc        mov     dword ptr [edi+ecx*4-4],eax
69ed1fdc 8d048d00000000  lea     eax,[ecx*4]
69ed1fe3 03f0            add     esi,eax
此时可以看出:
0:044> r edi
edi=01d37ce0
0:044> r ecx
ecx=00000001
而edi+ecx*4-4 = 01d37ce0,即为溢出的那4个字节,查看内存内容:
0:044> dd 01d37cd0
01d37cd0  38c97823 88000001 31786469 00000004
01d37ce0  44434241 8c000001 b30518eb 00000069
01d37cf0  38c97827 80000000 01d1003a 00000000
01d37d00  38c97819 80000000 38c9003c 80000000
发现已经被重写了,也就是说4字节的溢出发生了。
此时关闭暴风影音,在windbg可以捕获以下异常:
(1284.eec): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=44434241 ebx=01d37ce8 ecx=01de0000 edx=01d37ce8 esi=7d59a104 edi=01d37ce0
eip=773de546 esp=024ef718 ebp=024ef74c iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
ntdll!RtlpLowFragHeapFree+0x31:
773de546 8b4604          mov     eax,dword ptr [esi+4] ds:002b:7d59a108=????????
查看函数调用信息:
0:001> kv
ChildEBP RetAddr  Args to Child
024ef74c 773de193 01d37ce8 01cca2c0 75b55689 ntdll!RtlpLowFragHeapFree+0x31 (FPO: [Non-Fpo])
024ef764 76a014bd 01de0000 00000000 01d37ce8 ntdll!RtlFreeHeap+0x105 (FPO: [Non-Fpo])
024ef778 69ee016a 01de0000 00000000 01d37ce8 kernel32!HeapFree+0x14 (FPO: [Non-Fpo])
024ef78c 026eb557 01d37ce8 01cbeecc 01cd1210 MSVCR100!free+0x1c (FPO: [Non-Fpo])
WARNING: Stack unwind information not available. Following frames may be wrong.
024ef7c8 026d1e62 01cbdea0 01cbeeb8 01cbde80 StormPlayer_24f0000!StormPlayer_PlayPre+0x79647
可以发现上述几个Free函数都是为了释放0x01d37ce8地址所代表的堆。根据LFH低碎片堆的内存布局:
0:001> !heap -x 01d37ce8

分页阅读: 1 2 3 4 5 6 7 8 9 10
【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。