科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

我们知道在我们对溢出漏洞进行eXP的时候,经常要利用全局性的指针,利用异常处理。那么XP的SP2对此作了处理。使得我们无法运用以前的技巧来完成我们的工作。
  • 评论
  • 分享微博
  • 分享邮件
  PAGE:004B239A mov [ebp-0CCh], ecx
  PAGE:004B23A0 mov [ebp-0D4h], edi
  PAGE:004B23A6 mov eax, 0
  PAGE:004B23AB mov ecx, [ebp-0D4h]
  PAGE:004B23B1 mov edx, [ebp-0CCh]
  PAGE:004B23B7 cmpxchg [ecx], edx
  PAGE:004B23BA push 4
  PAGE:004B23BC pop edx
  ;重新转到loc_4970EA,再一次得到刚才生成的随机数,如果该生成的随机数为
  ;0,则还会重新生成。
  PAGE:004B23BD jmp loc_4970EA
  }
  ;得到随机数之后,将其拷贝到用户栈中的一个临时变量中,esi保存的就是这个临时
  ;变量的地址。至此,就得到了一个跟进程相关的随机数,该随机数跟进程的创建时间
  ;相关。
  PAGE:004970FD mov dword ptr [ebp-4], 15h
  PAGE:00497104 mov [esi], eax
  PAGE:00497106 test ebx, ebx
  PAGE:00497108 jnz loc_497AA5
  PAGE:0049710E jmp loc_4955F5
  
  到这里我们已经完全清楚了整个随机数的获取过程。该随机数跟进程的创建时间相关,可见我们是无法猜得该随机数的。不过这个随机数只是再进程创建的时候产生,并且直到进程结束,该随机数都不会改变。所以,如果我们可以得到该随机数,在进程结束之前还是可以利用的。比如我们可以将其和我们的跳转地址进行异或,通过溢出将其写入到最高溢出处理地址,就可以像以前一样利用了。
  
  不过这种方法对于远程溢出是无法利用的。但是如果能够覆盖程序的导入表或者静态数据段,那就是最理想的情况了。不过系统DLL的导入表不能够修改,但是一般程序的导入表还都是可以改的,所以还是有利用的可能性的。如果在静态数据段中存在某些函数的指针,则可以进行覆盖,从而加以利用,如果存在这种情况的话,要做到利用的通用还是有可能的。
  
  3、VEH链表指针_RtlpCalloutEntryList的保护
  
  我们知道堆溢出经常用的一个技巧就是修改VEH的链表指针。这在XP sp0和sp1的环境下都好使。但是sp2同样堵住了这条路。
  
  XP_sp2下
  
  异常处理过程
  KiUserExceptionDispatcher
  |
  ________RtlDispatchException
  |
  ___________RtlCallVectoredExceptionHandlers
  
  sp2中,该指针位于
  .data:7C99C320 _RtlpCalloutEntryList dd 0 ; DATA XREF: LdrpInitializeProcess(x,x,x,x,x)+2EFo
  .data:7C99C320 ; LdrpInitializeProcess(x,x,x,x,x)+2F9w ...
  
  我们就直接看看RtlCallVectoredExceptionHandlers函数
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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