4.3.1 溢出点的定位

“Messenger 服务是一个 Windows 服务,它传送 net send 消息。在CMD控制台下,我们执行 net send 对方计算机名 消息 ,对方就会弹出一个信使服务对话框,显示我们传递给它的消息内容。如图4-34。”

“哦,这种消息传送的方法,比不上QQ、MSN,有什么用呢?”大家问道。

“Windows Message服务除了用于用户间发送消息、管理员向用户发送管理警报外,也可用作事件通知,比如当打印作业完成或计算机断电而切换到UPS时,自动使用Message通知用户。”

“哦,原来可以和其他程序联动啊!”大家都明白了。

“是的。我们从图3-34的信使服务对话框中可以看出,传送的Message包括发送方计算机名、接收方计算机名、时间和消息。”

“确切的说,Message数据包的结构如图4-35。它是通过NetBIOS(即137-139端口或UDP的135端口)传输的。”

“有了Message结构和前面网络编程的基础,我们完全可写出一个程序来完成net send正常传送消息的功能。”老师说道,“但我们要更进一步,不仅要能正常传送,还要使其溢出!”

“哦?是哪部分发生了溢出呢?时间部分?还是机器名部分?”大家猜测道。

“呵呵,微软的公告上都说了,导致该漏洞的原因是:没有正确的验证长度就把消息传递给缓冲区了。所以消息部分过长后,就可以导致堆溢出!”

“哦,是这样啊!”

“明白了溢出的原因后,我们就可以先搭一个框架,然后根据别人的漏洞分析(或者利用前面的方法)定位溢出点。”老师在黑板上画了起来,“我们可以得到:是消息的2263个字节达到了下一个堆管理结构,接下来就是两个要改写的操作指针,如图4-36。”

“哦!和前面的堆溢出分析果然一模一样啊!”同学们感叹道。

“是的,我们继续按照经典的三步走,完成攻击。”