Loading
1

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

69e6303a 8d0c12          lea     ecx,[edx+edx]
69e6303d 51              push    ecx
69e6303e e869480100      call    AviSplitter!DllGetClassObject+0x337c (69e778ac)
69e63043 8986d4000000    mov     dword ptr [esi+0D4h],eax
备注:根据!heap –p –a命令的栈回溯信息可知,堆操作相关调用顺序如下:
call AviSplitter!DllGetClassObject+0x337c --> mfc100u+0x000bb327 --> MSVCR100!malloc
因此不考虑系统函数,进程中创建该堆的指令即为call指令。在此处下断点:
0:005> bp AviSplitter+0x0000303e
重新加载样本:
Breakpoint 0 hit
eax=31786469 ebx=00000000 ecx=00000004 edx=00000002 esi=22392f08 edi=00000270
eip=69e6303e esp=0f8bf338 ebp=0f8bf38c iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
AviSplitter+0x303e:
69e6303e e869480100      call    AviSplitter!DllGetClassObject+0x337c (69e778ac)
F10 Step Over单步执行:
0:005> p
eax=1a7d2ff8 ebx=00000000 ecx=00000004 edx=00000000 esi=22392f08 edi=00000270
eip=69e63043 esp=0f8bf338 ebp=0f8bf38c iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
AviSplitter+0x3043:
69e63043 8986d4000000    mov     dword ptr [esi+0D4h],eax ds:002b:22392fdc=00000000
根据“一般情况下,函数返回值是通过eax进行传递”的规律,此时eax就是malloc函数申请的页堆起始地址。查看页堆信息:
0:005> !heap -p -a eax
address 1a7d2ff8 found in _DPH_HEAP_ROOT @ 6d51000
in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
1ed50104:               1a7d2ff8                4 -         1a7d2000             2000
6c918e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
776b1d4e ntdll!RtlDebugAllocateHeap+0x00000030
7766b586 ntdll!RtlpAllocateHeap+0x000000c4
77613541 ntdll!RtlAllocateHeap+0x0000023a
6c850269 MSVCR100!malloc+0x0000004b
65feb327 mfc100u+0x000bb327
69e63043 AviSplitter+0x00003043
69e6333f AviSplitter+0x0000333f
可以发现该页堆申请了4个字节,查看堆的内容:
0:005> dd eax
1a7d2ff8  c0c0c0c0 d0d0d0d0 ???????? ????????
1a7d3008  ???????? ???????? ???????? ????????
要是说c0c0c0c0填充代表着堆的初始化数据,那尾部出现d0d0d0的填充代表什么呢?
查看P680第23.9.3页堆的堆块结构小节可知:
页堆堆块的数据区由三部分组成,起始处是一个固定长度0×20字节的DPH_BLOCK_INFORMATION结构,我们将其称为页堆堆块的头结构;中间是用户数据区;最后是用于满足分配粒度要求而多分配的额外字节。如果应用程序申请的长度(即用户数据区的长度)正好是分配粒度的倍数,比如16字节,那么第三部分就不存在了。
查看eax前移0×20字节的内存:
0:005> dd eax-0x20
1a7d2fd8  abcdbbbb 06d51000 00000004 00001000
1a7d2fe8  00000000 00000000 03f54484 dcbabbbb
1a7d2ff8  c0c0c0c0 d0d0d0d0 ???????? ????????
1a7d3008  ???????? ???????? ???????? ????????
还可以查看DPH_BLOCK_INFORMATION结构的详细信息:
0:005> dt ntdll!_DPH_BLOCK_INFORMATION eax-0x20
+0x000 StartStamp       : 0xabcdbbbb
+0x004 Heap             : 0x06d51000 Void
+0x008 RequestedSize    : 4
+0x00c ActualSize       : 0x1000
+0x010 FreeQueue        : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x010 FreePushList     : _SINGLE_LIST_ENTRY
+0x010 TraceIndex       : 0
+0x018 StackTrace       : 0x03f54484 Void

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