00000260h: 64 62 00 00 00 00 69 64 78 31 02 00 00 00 41 42
那如何验证后4个字节与样本内容是否存在关系呢?将样本末尾内容修改为:
00000260h: 64 62 00 00 00 00 69 64 78 31 03 00 00 00 41 42
重新加载poc.avi并下堆的创建断点:
0:003> bp AviSplitter+0x0000303e
0:034> g
Breakpoint 1 hit
eax=31786469 ebx=00000000 ecx=00000006 edx=00000003 esi=238eaf08 edi=00000270
eip=6697303e esp=1758f338 ebp=1758f38c 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:
6697303e e869480100 call AviSplitter!DllGetClassObject+0x337c (669878ac)
创建堆后:
0:034> p
eax=229dcff8 ebx=00000000 ecx=00000006 edx=00000000 esi=238eaf08 edi=00000270
eip=66973043 esp=1758f338 ebp=1758f38c 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:
66973043 8986d4000000 mov dword ptr [esi+0D4h],eax ds:002b:238eafdc=00000000
查看此时的附近的指令:
66973032 894dec mov dword ptr [ebp-14h],ecx
66973035 e908030000 jmp AviSplitter+0x3342 (66973342)
6697303a 8d0c12 lea ecx,[edx+edx]
6697303d 51 push ecx
6697303e e869480100 call AviSplitter!DllGetClassObject+0x337c (669878ac)
66973043 8986d4000000 mov dword ptr [esi+0D4h],eax
66973049 c70069647831 mov dword ptr [eax],31786469h
6697304f 8b45ec mov eax,dword ptr [ebp-14h] -- eax的来源
66973052 8b96d4000000 mov edx,dword ptr [esi+0D4h]
66973058 83c404 add esp,4
6697305b 894204 mov dword ptr [edx+4],eax -- 写入第5-8个字节
6697305e 8b86d4000000 mov eax,dword ptr [esi+0D4h]
66973064 8b4dec mov ecx,dword ptr [ebp-14h]
66973067 6a00 push 0
66973069 51 push ecx
6697306a 83c008 add eax,8
6697306d e989010000 jmp AviSplitter+0x31fb (669731fb)
此时第5-8字节写入的内容来自于eax,eax又来自于ebp-0×14位置:
0:034> dd ebp-0x14 l1
1758f378 00000003
可以发现,向第5-8字节写入的内容与修改后的样本对应内容完全一致。因此可以断定,向页堆第5-8个字节写入的确实是样本文件中的内容。
到这里,得出结论:
a. 提前写入的8个字节当中,前4个字节是以固定指令写入的,后4个字节写入的是样本文件内容
b. 在执行memcpy函数之前,堆创建后立即被写入了这8个字节
在上述call指令断点时,还发现一个现象:
0:034> r ecx
ecx=00000006
结合上述断点处的指令序列,call指令调用的是malloc函数,其输入参数是ecx=00000006,也就是申请的页堆大小为6字节。查看生成的页堆信息:
0:034> !heap -p -a eax
address 229dcff8 found in _DPH_HEAP_ROOT @ 6d11000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
22d21e04: 229dcff8 6 - 229dc000 2000
6c1d8e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
77f21d4e ntdll!RtlDebugAllocateHeap+0x00000030
◆◆1
发表评论