标题:Windows平台下的堆溢出利用技术
作者:mr_me
译者:riusksk(泉哥:http://riusksk.blogbus.com)

前言
在栈溢出中我们一般都是通过控制指令指针EIP,或者覆盖SEH来实现溢出利用的,而在本文即将讲到及测试所使用的利用技术中,并没有直接运用到覆盖EIP或者SEH。我们将通过覆盖一可控制的内存地址,进而实现任意的DWORD覆写。如果你对栈溢出的认识还没有达到中/高等水平,那么我建议你先集中精力去学习一下。本文所讲述的利用技术均是些年过已久的旧技术,如果你有什么新的利用技术,记得分享一下。阅读本文前你需要具备以下条件:
●  Windows XP SP1;
●  调试器(Olly Debugger, Immunity Debugger, windbg等等);
●  C/C++ 编译器(Dev C++, lcc-32, MS visual C++ 6.0);
●  脚本语言执行环境(本文使用python,你也可以使用perl);
●  大脑;
●  具备汇编和C语言知识,并懂得如何用调试器去调试它们;
●  Olly Debugger插件HideDbg,或者Immunity Debugger的!hidedebug命令插件;
●  时间。
我们在本文主要注重于基础知识,这些技术可能因有些过时而未在“现实世界”中使用,但有一点你必须记住,如果你想提高技术,就必须知晓过去,并取其所长来为己所用!

堆的定义及其在XP下的工作原理
堆是进程用于存储数据的场所,每一进程均可动态地分配和释放程序所需的堆内存,同时允许全局访问。需要指出的是,栈是向0x00000000生长的,而堆是向0xFFFFFFFF生长的。这意味着如果某进程连续两次调用HeapAllocate()函数,那么第二次调用函数返回的指针所指向的内存地址会比第一次的高,因此第一块堆溢出后将会溢出至第二块堆内存。
更多内容请参见附件………………

上传的附件 windows平台下的堆溢出利用技术.doc