安全 – 堆溢出攻击

堆溢出攻击如何完成?

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

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

注意这个不同的平台,我的例子过于简化。它基本上归结于具有链接列表的堆管理器,这些列表可能被超载,您可以使用链表指针覆盖进程内存的随机部分。

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

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

    // Actual heap buffer follows this structure.
};

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

本文对堆溢出攻击有一个很好的概述:
http://www.h-online.com/security/A-Heap-of-Risk–/features/74634

本文介绍了Vista的堆管理器的一些强化,以防止这种攻击:
http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

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

http://stackoverflow.com/questions/667177/heap-overflow-attacks

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:安全 – 堆溢出攻击