首页 网络安全 安全学院 查看内容

MS08067补丁前后比较分析结果

2008-10-27 10:34 903 0

摘要:   MS08-067: Server 服务中的漏洞可能允许远程代码执行  http://www.microsoft.com/china/technet/security/bulletin/MS08-0...
关键词: int wchar WORD return 缓冲区 v13 LABEL 函数 v5 92

  MS08-067: Server 服务中的漏洞可能允许远程代码执行  http://www.microsoft.com/china/technet/security/bulletin/MS08-067.mspx  这条更新为重要,可以说与当年的冲击波类似。上午我对补丁前后分析,定位到微软修改过的函数结果如下:  发生缓冲区溢出的函数:  signed int __stdcall sub_5FDDA180(int a1, wchar_t *a2, int a3, int a4, int a5)  {  wchar_t *v5; // ebx@1  size_t v6; // edi@1  int v7; // esi@1  int v8; // edi@3  signed int result; // eax@4  wchar_t *v10; // eax@5  unsigned int v11; // eax@10  size_t v12; // eax@14  __int16 v13; // ax@16  size_t v14; // eax@3  int v15; // [sp+428h] [bp-4h]@1  wchar_t *v16; // [sp+10h] [bp-41Ch]@1  int v17; // [sp+Ch] [bp-420h]@1  wchar_t v18; // [sp+14h] [bp-418h]@2  v5 = a2;  v15 = dword_5FE1E18C;  v7 = a1;  v16 = (wchar_t *)a3;  v6 = 0;  v17 = a5;  if ( a1 && *(_WORD *)a1 )  {  v12 = wcslen((const wchar_t *)a1);  v6 = v12;  if ( v12 )  {  if ( v12 > 0x208 )  return 123;  wcscpy(&v18, (const wchar_t *)v7);  v13 = LOWORD((&v16)[v6 + 1]);  if ( v13 != 92 )  {  if ( v13 != 47 )  {  wcscat(&v18, &word_5FDECBD4);  ++v6;  }  }  if ( *v5 == 92 || *v5 == 47 )  ++v5;  }  }  else  {  v18 = 0;  }  v14 = wcslen(v5);  v8 = v14 + v6;  if ( v8 < v14 )  return 123;  if ( (unsigned int)v8 > 0x207 )  return 123;  wcscat(&v18, v5);  v10 = &v18;  if ( v18 )  {  do  {  if ( *v10 == 47 )  *v10 = 92;  ++v10;  }  while ( *v10 );  }  if ( !sub_5FDD9F7A(&v18) && !sub_5FDDA26B((int)&v18) )//这个函数修改过了  return 123;  v11 = 2 * wcslen(&v18) + 2;  if ( v11 > a4 )  {  if ( v17 )  *(_DWORD *)v17 = v11;  result = 2123;  }  else  {  wcscpy(v16, &v18);//缓冲区溢出点  result = 0;  }  return result;  }  被修改的函数:  //----- (5FDDA26B) --------------------------------------------------------  signed int __stdcall sub_5FDDA26B(int a1)  {  wchar_t v1; // ax@1  int v2; // ecx@1  int v3; // ebx@1  int v4; // edi@1  int v5; // esi@3  int v6; // eax@10  __int16 v7; // dx@10  __int16 v8; // bx@11  __int16 v10; // dx@17  int v11; // ecx@18  __int16 v12; // ax@19  int v13; // eax@34  wchar_t *v14; // ecx@41  char v15; // zf@1  int v16; // [sp+Ch] [bp-4h]@1  v2 = a1;  v1 = *(_WORD *)a1;  v3 = 0;  v4 = 0;  v15 = *(_WORD *)a1 == 92;  v16 = 0;  if ( v15 || v1 == 47 )  {  v10 = *(_WORD *)(a1 + 2);  if ( v10 == 92 || v10 == 47 )  {  v11 = a1 + 4;  while ( 1 )  {  v12 = *(_WORD *)v11;  if ( *(_WORD *)v11 == 92 )  break;  if ( v12 == 47 )  break;  if ( !v12 )  return 0;  v11 += 2;  }  if ( !*(_WORD *)v11 || (v2 = v11 + 2, v1 = *(_WORD *)v2, a1 = v2, v1 == 92) || v1 == 47 )  return 0;  }  }  v5 = v2;  if ( !v1 )  return 1;  while ( 1 )  {  if ( v1 == 92 )  {  if ( v3 == v5 - 2 )  return 0;  v4 = v3;  v16 = v5;  goto LABEL_6;  }  if ( v1 != 46 || v3 != v5 - 2 && v5 != v2 )  goto LABEL_6;  v6 = v5 + 2;  v7 = *(_WORD *)(v5 + 2);  if ( v7 == 46 )  {  v8 = *(_WORD *)(v5 + 4);  if ( v8 == 92 || !v8 )  {  if ( !v4 )  return 0;  wcscpy((wchar_t *)v4, (const wchar_t *)(v5 + 4)); //可能会发生缓冲区溢出  if ( !v8 )  return 1;  v16 = v4;  v5 = v4;  v13 = v4 - 2;  while ( *(_WORD *)v13 != 92 && v13 != a1 )  v13 -= 2;  v2 = a1;  v4 = v13 & -(*(_WORD *)v13 == 92);  }  goto LABEL_6;  }  if ( v7 != 92 )  break;  if ( v3 )  {  v14 = (wchar_t *)v3;  }  else  {  v6 = v5 + 4;  v14 = (wchar_t *)v5;  }  wcscpy(v14, (const wchar_t *)v6);//可能会发生缓冲区溢出  v2 = a1;  LABEL_7:  v1 = *(_WORD *)v5;  if ( !*(_WORD *)v5 )  return 1;  v3 = v16;  }  if ( v7 )  {  LABEL_6:  v5 += 2;  goto LABEL_7;  }  if ( v3 )  v5 = v3;  *(_WORD *)v5 = 0;  return 1;  }
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部