如何进行堆溢出攻击?
在stackoverflow攻击的情况下,攻击者用他的地址替换函数返回地址.
这是如何在堆溢出攻击中完成的?此外,是否可以从堆运行代码?
请注意,这因平台而异,我的示例过于简单.它基本上归结为具有可能溢出的链表的堆管理器,并且您可以使用链接列表指针来覆盖进程内存的随机部分.
想象一下,我有一个天真的堆实现,其控制块是这样的:
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"样式攻击 - 将返回地址覆盖为可执行的已知函数.