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
发表评论