Loading
1

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

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