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的某个地址,都有可能造成不可信的覆盖。”