科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道对WindowsXP SP2溢出漏洞进行保护(2)

对WindowsXP SP2溢出漏洞进行保护(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们知道在我们对溢出漏洞进行eXP的时候,经常要利用全局性的指针,利用异常处理。那么XP的SP2对此作了处理。使得我们无法运用以前的技巧来完成我们的工作。
  • 评论
  • 分享微博
  • 分享邮件

  PAGE:004B0208 loc_4B0208: ;CODE XREF: MiCreatePebOrTeb(x,x,x)+48ADj

  PAGE:004B0208 mov edi, [ebp+arg_C]

  PAGE:004B020B mov eax, _MmHighestUserAddress

  PAGE:004B0210 push edi

  PAGE:004B0211 push dword ptr [ebx+11Ch]

  PAGE:004B0217 add eax, 0FFFF0001h

  PAGE:004B021C push 1000h

  PAGE:004B0221 push eax

  PAGE:004B0222 mov eax, [ebp+arg_8]

  PAGE:004B0225 add eax, 0FFFh

  PAGE:004B022A and eax, 0FFFFF000h

  PAGE:004B022F push eax

  PAGE:004B0230 call ">_MiFindEmptyAddressRangeDownTree@20 ;MiFindEmptyAddressRangeDownTree(x,x,x,x,x)

  PAGE:004B0235 test eax, eax

  PAGE:004B0237 mov [ebp+arg_C], eax

  PAGE:004B023A jl loc_5267A5

  关键是这里

  PAGE:004B4A0A loc_4B4A0A: ;CODE XREF: MiCreatePebOrTeb(x,x,x)+66j

  PAGE:004B4A0A mov edi, _MmHighestUserAddress

  ;总是7FFEFFFF

  PAGE:004B4A10 lea eax, [ebp+var_C]

  PAGE:004B4A13 push eax

  PAGE:004B4A14 add edi, 0FFFF0001h

  ;此时edi为7FFE0000

  PAGE:004B4A1A call _KeQueryTickCount@4 ;KeQueryTickCount(x)

  PAGE:004B4A1F mov eax, [ebp+var_C]

  PAGE:004B4A22 and eax, 0Fh

  ;只取最后一个字节的值,比如此时为0C

  PAGE:004B4A25 cmp eax, 1

  ;看eax此时是不是为01

  PAGE:004B4A28 mov [ebp+var_C], eax

  PAGE:004B4A2B jbe loc_4B4928

  ;如果是就跳到去处理

  PAGE:004B4A31 loc_4B4A31: ;CODE XREF: MiCreatePebOrTeb(x,x,x)+4792j

  PAGE:004B4A31 shl eax, 0Ch

  PAGE:004B4A34 sub edi, eax

  PAGE:004B4A36 lea eax, [edi+0FFFh]

  PAGE:004B4A3C push eax

  PAGE:004B4A3D push edi

  PAGE:004B4A3E push ebx

  PAGE:004B4A3F mov [ebp+var_4], edi

  PAGE:004B4928 loc_4B4928: ;CODE XREF: MiCreatePebOrTeb(x,x,x)+488Fj

  如果eax为1,那么就更改为2.这样避免最后计算出来为7FFDF000.而是为7FFDE000

  PAGE:004B4928 push 2

  PAGE:004B492A pop eax

  PAGE:004B492B mov [ebp+var_C], eax

  PAGE:004B492E jmp loc_4B4A31

  因为KeTickCount是进程的一个时间计数,所以无法预测。

  .text:0041CAA8 mov edi, edi

  .text:0041CAAA push ebp

  .text:0041CAAB mov ebp, esp

  .text:0041CAAD mov ecx, _KeTickCount.High1Time

  .text:0041CAB3 mov eax, [ebp+arg_4]

  .text:0041CAB6 mov [eax+4], ecx

  .text:0041CAB9 mov edx, _KeTickCount.LowPart

  .text:0041CABF mov [eax], edx

  经过上面的分析我们知道,如果如果eax随机出来是1,2,那么最后分配的PEB的地址都是7FFDE000,这是为了避免以前的7FFDF000地址的出现,使得以前的堆利用代码都失效。

  1,2 7FFDE000

  3 7FFDD000

  4 7FFDC000

  5 7FFDB000

  6 7FFDA000

  7 7FFD9000

  8 7FFD8000

  9 7FFD7000

  A 7FFD6000

  B 7FFD5000

  C 7FFD4000

  D 7FFD3000

  E 7FFD2000

  F 7FFD1000

  0 7FFDE000

  上面列出了可以看到PEB的所有可能值,可以看到7FFDE000的概率最高,1/8,其他都是1/16。:),但即使这样,也没法稳定利用了。

  2、对TOP SEH的保护

  微软对函数SetUnhandledExceptionFilter的代码进行了重大的调整。SetUnhandledExceptionFilter是kernel32.dll中导出的一个函数,用来设置一个筛选器异常处理回掉函数,这个回掉函数不替换系统默认的异常处理程序,而只是在它前面进行了一些预处理,操作的结果还是会送到系统默认的异常处理程序中去,这个过程就相当于对异常进行了一次筛选。

  函数的SetUnhandledExceptionFilter调用方式为:

  LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(

  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter

  );

  这个函数唯一的一个参数就是需要设置的回调函数的地址,返回值为上一次设置的回掉函数的地址。该函数不是在原来的回掉函数前再挂一个回掉函数,而是用这个新的回掉函数替换原来的那个回掉函数。如果地址参数被指定为NULL,那么系统将去掉这个“筛子”而直接将异常送往默认的异常处理程序。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章