0x00 分析
使用windbg目录下的gflag.exe 开启堆页,以便后续的调试使用:
C:\Program Files\Debugging Tools for Windows (x86)> gflags.exe -i IExplore.exe +hpa
Current Registry Settings for IExplore.exe executable are: 02000000
hpa - Enable page heap
使用od attach ie,打开poc.html
选择加载activeX控件。程序断点断在 mov al, byte ptr [esi]处
查看esi中的数据,可以发现esi中的数据为0,由于设置了页堆,取值时会触发异常。
按alt + e 查看加载的dll文件找到断点处所在的dll
使用ida加载winmm.dll
定位到0x76b2d224所在的函数,按f5查看c源代码:
通过阅读源代码了解到该漏洞函数的变量传递途径,对变量下条件日志断点,在od中动态运行研究,第一个断点是函数入口点地址。
按f9运行直到断下
可以发现v2和wparam是不变的参数,而v9是逐渐递增的计数器,v11和v13是相等的,最后,v21取了v13的最后一个字节的值9f
由MIDI的格式可知,9f代表的是Note On打开音符事件,由此可知v13,v11应该是包含了参数的音轨事件。因此在取9f的v11处的地址0x76b2d0b5处下条件断点,输入 [ebx+eax] == “0x007db29f”,即在取到音轨事件时断下。
单步执行:
76B2D0B2 >|. 8B45 08 |mov eax, dword ptr [ebp+8]
76B2D0B5 >|. 8B0C03 |mov ecx, dword ptr [ebx+eax]
76B2D0B8 |. 83C3 04 |add ebx, 4
76B2D0BB |. 8BC1 |mov eax, ecx
76B2D0BD |. 895E 24 |mov dword ptr [esi+24], ebx
76B2D0C0 |. C1E8 18 |shr eax, 18
76B2D0C3 |. 81E1 FFFFFF00 |and ecx, 0FFFFFF
76B2D0C9 |. 33DB |xor ebx, ebx
76B2D0CB |. 395D F4 |cmp dword ptr [ebp-C], ebx
76B2D0CE |. 8845 0B |mov byte ptr [ebp+B], al
76B2D0D1 >|. 894D F8 |mov dword ptr [ebp-8], ecx
76B2D0D4 |. 74 2A |je short 76B2D100
76B2D0D6 |. A8 40 |test al, 40
76B2D0D8 |. 74 26 |je short 76B2D100
76B2D0DA |. 8B45 F0 |mov eax, dword ptr [ebp-10]
76B2D0DD |. 53 |push ebx
76B2D0DE |. 56 |push esi
76B2D0DF |. 8946 1C |mov dword ptr [esi+1C], eax
76B2D0E2 |. FF77 4C |push dword ptr [edi+4C]
76B2D0E5 |. 0FB747 4A |movzx eax, word ptr [edi+4A]
76B2D0E9 |. 68 CA030000 |push 3CA
76B2D0EE |. FF77 04 |push dword ptr [edi+4]
76B2D0F1 |. 50 |push eax
76B2D0F2 |. FF77 44 |push dword ptr [edi+44]
76B2D0F5 |. E8 9F83FEFF |call DriverCallback
76B2D0FA |. 8A45 0B |mov al, byte ptr [ebp+B]
76B2D0FD |. 8B4D F8 |m