4.5.2 覆盖Vector异常句柄

“在XP下,有一种特殊的结构——Vector异常句柄结构。它和传统的异常处理链存在堆栈中不同,Vector是存在堆里的。”

小知识:Vector异常句柄结构

  struct _VECTORED_EXCEPTION_NODE
  {
      DWORD m_pNextNode; 
      DWORD m_pPreviousNode; 
      PVOID m_pfnVectoredHandler;
  }

“哦?莫非我们可通过覆盖它来实现跳转?”宇强听出了一点意思。

“不错!很有创新思维嘛!”老师笑道。

宇强不好意思的小声对小倩说:“其实老师都说出这个意思了!”

小倩回道:“但你悟性的确很好啊!”

“那里哦!听听老师怎么讲的吧!”宇强表面虽作推辞状,心里却高兴极了。

老师在台上说:“就是这样的,第一个Vector异常句柄位于地址0x77FC3210中,当作异常处理时,会有下面的处理:”

Mov esi,:[0x77FC3210]
  call [esi+8]

“所以,我们把where覆盖成0x77FC3210,而把what覆盖成ShellCode的地址-8。如图4-52。”

  

“假设ShellCode的地址是0x0012FF50,我们就把what覆盖成0x0012FF50-8=0x0012FF48。”

“当执行what→where时,0x77FC3210就会设为0x0012FF48;这样在发生异常处理时,先 mov esi,:[0x77FC3210] ,esi就会变为0x0012FF48;再执行 call [esi+8] 时,就是执行 call 0x0012FF50 。”

“哦!这样就可进入位于0x0012FF50地址的ShellCode了。”大家说道。

“是的!”

“这种方法也有不足之处吗?”

“又让大家失望了,的确是的,”老师说道,“第一个不足是只针对XP系统有效,Win2000下是没有Vector溢出处理的;第二个不足是:‘what’要么覆盖成ShellCode的地址,要么覆盖成是指向ShellCode的某个地址,都有可能造成不可信的覆盖。”