能力值:
( LV12,RANK:210 )
|
-
-
2 楼
03984053 |. 8B55 10 mov edx, dword ptr [ebp+10] ; FDEA38E1次数
03984056 |. 59 pop ecx
03984057 |. 85D2 test edx, edx
03984059 |. 74 3D je short 03984098
0398405B |. 8B4D 0C mov ecx, dword ptr [ebp+C] ; str1
0398405E >|> 8A01 /mov al, byte ptr [ecx] ; 取str第一个字符
03984060 |. 4A |dec edx
03984061 |. 0FB6F0 |movzx esi, al
03984064 |. F686 C1AF9903>|test byte ptr [esi+399AFC1], 4
0398406B >|. 8807 |mov byte ptr [edi], al
0398406D |. 74 13 |je short 03984082
0398406F |. 47 |inc edi
03984070 |. 41 |inc ecx
03984071 |. 85D2 |test edx, edx
03984073 |. 74 19 |je short 0398408E
03984075 |. 8A01 |mov al, byte ptr [ecx]
03984077 |. 4A |dec edx
03984078 |. 8807 |mov byte ptr [edi], al
0398407A |. 47 |inc edi
0398407B |. 41 |inc ecx
0398407C |. 84C0 |test al, al
0398407E |. 74 14 |je short 03984094
03984080 |. EB 06 |jmp short 03984088
03984082 |> 47 |inc edi
03984083 |. 41 |inc ecx
03984084 |. 84C0 |test al, al
03984086 |. 74 10 |je short 03984098
03984088 |> 85D2 |test edx, edx
0398408A |.^ 75 D2 \jnz short 0398405E
|
能力值:
( LV12,RANK:210 )
|
-
-
3 楼
0398408A |.^ 75 D2 \jnz short 0398405E 在这个下边一句下断点 F9 线程就退出了 断不下来
|
能力值:
( LV12,RANK:210 )
|
-
-
4 楼
对 FDEA38E1次数 下条件断点也断不下来 烦死了
|
能力值:
( LV10,RANK:160 )
|
-
-
5 楼
竹君兄已经学到ActiveX漏洞啦 ~,俺还停留在RootKit啊~~~
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
03984073 |. 74 19 |je short 0398408E
03984080 |. EB 06 |jmp short 03984088
03984086 |. 74 10 |je short 03984098
这些地方都有可能跳过你下断点的那条指令。。。
|
能力值:
( LV12,RANK:210 )
|
-
-
7 楼
不可能 满足不了条件的。最后分析是strrchr未验证 导致_mbsnbcp复制溢出。最终导致SEH指针被覆盖吧
|
能力值:
( LV12,RANK:210 )
|
-
-
8 楼
OD调试过程:
用IE7.0载入exploit.html,下断点bp DispCallFunc。由于我电脑安装有迅雷,直接断在了MediaMon模块,下条件断点[esp]!=2109921E即可,也可以在虚拟机干净环境调试。
中断在oleaut32.dll模块的DispCallFunc函数,向下查找call ecx。F4,F7进入imageMan.dll模块。
F8单步,记录下发生异常的Call。最终确定异常call顺序如下:
call 0418C310 (imageMan.dll)
|-----------call 7C94A50E (ntdll.dll)
|------------call 7C923247 (ntdll.dll)
|------------call 7C923282 (ntdll.dll)
|---------------call ecx (ntdll.dll)
最终是exc被污染导致溢出被利用。下面追踪ecx污染的原因。
1、call 0418C310负责copy字符。
call 0418C310----------------call 04244027-------覆盖SEH
04244053 |. 8B55 10 mov edx, dword ptr [ebp+10] ; FDEA38E1次数
04244056 |. 59 pop ecx
04244057 |. 85D2 test edx, edx
04244059 |. 74 3D je short 04244098
0424405B |. 8B4D 0C mov ecx, dword ptr [ebp+C] ; str
0424405E |> 8A01 /mov al, byte ptr [ecx] ; 取str第一个字符
04244060 |. 4A |dec edx
04244061 |. 0FB6F0 |movzx esi, al
04244064 |. F686 C1AF2504>|test byte ptr [esi+425AFC1], 4
0424406B |. 8807 |mov byte ptr [edi], al ;copy 至edi
0424406D |. 74 13 |je short 04244082
0424406F |. 47 |inc edi
04244070 |. 41 |inc ecx
04244071 |. 85D2 |test edx, edx
04244073 |. 74 19 |je short 0424408E
04244075 |. 8A01 |mov al, byte ptr [ecx]
04244077 |. 4A |dec edx
04244078 |. 8807 |mov byte ptr [edi], al
0424407A |. 47 |inc edi
0424407B |. 41 |inc ecx
0424407C |. 84C0 |test al, al
0424407E |. 74 14 |je short 04244094
04244080 |. EB 06 |jmp short 04244088
罪魁祸首就在这里。我们先看下内存以及SHE链。
0235C720-0235C820共260字节 WideCharToMultiByte
0235C824开始copy
SEH链
2、copy越界异常,进入ntdll.dll异常处理。
异常处理已经被覆盖了。
IDA定位:
0422AB7F- 04210000 + 10001000 -1000 = 1001AB7F
int __stdcall sub_1001AB7F(int a1, LPCWSTR lpWideCharStr, int a3)
{
int result; // eax@2
const OLECHAR *v4; // eax@3
CHAR FullPath; // [sp+118h] [bp-208h]@1
char v6; // [sp+119h] [bp-207h]@1
__int16 v7; // [sp+219h] [bp-107h]@1
char v8; // [sp+21Bh] [bp-105h]@1
_BYTE MultiByteStr[260]; // [sp+10h] [bp-310h]@1
char *v10; // [sp+114h] [bp-20Ch]@1
char Str; // [sp+21Ch] [bp-104h]@1
char v12; // [sp+21Dh] [bp-103h]@1
__int16 v13; // [sp+31Dh] [bp-3h]@1
char v14; // [sp+31Fh] [bp-1h]@1
FullPath = 0;
memset(&v6, 0, 0x100u);
v7 = 0;
v8 = 0;
WideCharToMultiByte(0, 0, lpWideCharStr, -1, &FullPath, 260, 0, 0);
MultiByteStr[0] = 0;
memset(&MultiByteStr[1], 0, 0x100u);
*(_WORD *)&MultiByteStr[257] = 0;
MultiByteStr[259] = 0; // 查找路径中的\
v10 = strrchr(&FullPath, '\\');
Str = 0;
memset(&v12, 0, 0x100u);
v13 = 0;
v14 = 0;
mbsnbcpy(&Str, &FullPath, v10 - &FullPath + 1); //这玩意出事的。复制越界
sub_100271FE(&Str);
sub_10018BA1(&FullPath, (int)MultiByteStr);
sub_1001BFE0(MultiByteStr);
if ( a3 )
{
v4 = (const OLECHAR *)sub_1001C060();
*(_DWORD *)a3 = SysAllocString(v4);
sub_1001C040();
result = 0;
}
else
{
sub_1001C040();
result = 0;
}
return result;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
壮壮v5~~关注到这个了~围观了一下~~
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
Mark一下
|