2

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

调用错误处理例程/对象。另一种方法是将错误处理集中在全局错误处理例程或错误处理对象中。这种方法的优点是可以集中处理错误的责任,这可以使调试更容易。折衷方案是整个程序将了解此核心功能并将其耦合。如果您想在另一个系统中重用系统中的任何代码,则必须将错误处理机制与您重用的代码一起拖动。

后来它说:

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

但我无法真正理解上面的陈述。缓冲区溢出如何导致地址受损?

4

1 回答 1

2

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

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

请注意,细节都取决于您的程序使用的框架或操作系统。本教程有一个很好的 Windows 示例:

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

也就是说,缓冲区溢出可能会使错误处理程序不安全,而无需替换其地址。典型的例子是文本编辑器在内部错误迫使进程崩溃之前使用全局错误处理程序将文档保存到文件中。了解程序的攻击者可以使用缓冲区溢出来用他们控制的不同资源(如网络套接字)替换文件流句柄并拦截输出。

于 2014-09-16T11:55:54.510 回答