19

堆溢出攻击是如何执行的?

在堆栈溢出攻击的情况下,攻击者将函数返回地址替换为他选择的地址。

在堆溢出攻击的情况下如何做到这一点?另外,是否可以从堆中运行代码?

4

1 回答 1

32

请注意,这因平台而异,我的示例过于简化。它基本上归结为具有可能被溢出的链表的堆管理器,并且您可以使用链表指针来覆盖进程内存的随机部分。

想象一下,我有一个简单的堆实现,它的控制块是这样的:

struct HeapBlockHeader
{
    HeapBlockHeader* next;
    HeapBlockHeader* prev;
    int size;

    // Actual heap buffer follows this structure.
};

当堆被释放时,这个控制块通过修改下一个/上一个指针返回到一个已释放块的列表中。如果我超出堆缓冲区,我可以用我控制的数据覆盖下一个控制块中的指针。假设我覆盖这些链接以指向代码的指针(可能只是在我覆盖的缓冲区中)和堆栈上函数的返回地址。当堆管理器试图将块链接回一个已释放的列表时,它实际上会用指向我控制的代码的指针覆盖堆栈上的返回地址。

这篇文章对堆溢出攻击有一个很好的概述: http ://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

这篇文章描述了进入 Vista 的堆管理器以防止这种攻击的一些强化:http: //www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

编辑:关于从堆运行代码的可能性,是的,这是可能的。许多平台现在默认使堆内存不可执行,这增加了运行任意代码的障碍。但是,您仍然可以执行“跳转到 libc”样式的攻击 - 将返回地址覆盖为可执行的已知函数。

于 2009-03-20T17:52:09.527 回答