堆溢出攻击

时间:2009-03-20 17:37:16

标签: security buffer-overflow

如何进行堆溢出攻击?

在stackoverflow攻击的情况下,攻击者用他的地址替换函数返回地址。

如何在堆溢出攻击中完成此操作?另外,是否可以从堆运行代码?

1 个答案:

答案 0 :(得分:32)

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

想象一下,我有一个天真的堆实现,其控制块是这样的:

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

    // Actual heap buffer follows this structure.
};

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

本文对堆溢出攻击有一个很好的概述: 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”样式攻击 - 将返回地址覆盖为可执行的已知函数。