缓冲区溢出和集中式错误处理

时间:2014-08-18 03:04:13

标签: c error-handling buffer-overrun

我正在阅读 Code Complete 2 ,我在错误处理中遇到了这句话:

  

调用错误处理例程/对象。另一种方法是   在全局错误处理例程中集中错误处理或   错误处理对象。这种方法的优点是   错误处理责任可以集中,这可以使   调试更容易。权衡是整个程序都知道   关于这个核心能力,并将与它相结合。如果你曾经   想要在另一个系统中重用系统中的任何代码,   您必须将错误处理机制与代码一起拖动   你重用了。

后来它说:

  

这种方法具有重要的安全意义。如果您的代码有   遇到缓冲区溢出,攻击者可能有   破坏了处理程序例程或对象的地址。因此,一旦一个   应用程序运行时发生了缓冲区溢出,但是没有   使用这种方法更安全。

但我无法理解上述陈述。缓冲区溢出如何导致地址泄露?

1 个答案:

答案 0 :(得分:2)

这是因为错误处理函数的地址存储在应用程序可访问的内存区域,非常类似于32位或64位整数,具体取决于您的平台。这通常位于堆栈底部的某个位置,但是在全局错误处理程序的情况下,它可以位于不同的位置,只要线程知道如何到达那里。

在缓冲区溢出的情况下,如果使用不同函数的地址覆盖此内存,则在应用程序中发生错误时,将调用新函数而不是预期的错误处理函数。

请注意,详细信息都取决于程序使用的框架或操作系统。本教程为Windows提供了一个很好的示例:

http://www.primalsecurity.net/0x3-exploit-tutorial-buffer-overflow-seh-bypass/

也就是说,缓冲区溢出可能会导致错误处理程序不安全而不替换其地址。典型的例子是文本编辑器,它使用全局错误处理程序将文档保存到文件,然后iternal错误强制进程崩溃。具有程序知识的攻击者可能会使用缓冲区溢出来将文件流句柄替换为它们控制的不同资源(如网络套接字)并拦截输出。