Windows平台下堆溢出利用技术

Windows平台下堆溢出利用技术

ID:30190058

大小:633.50 KB

页数:13页

时间:2018-12-28

Windows平台下堆溢出利用技术_第1页
Windows平台下堆溢出利用技术_第2页
Windows平台下堆溢出利用技术_第3页
Windows平台下堆溢出利用技术_第4页
Windows平台下堆溢出利用技术_第5页
资源描述:

《Windows平台下堆溢出利用技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Windows平台下的堆溢出利用技术作者:mr_me译者:riusksk(泉哥:http://riusksk.blogbus.com)前言在栈溢出中我们一般都是通过控制指令指针EIP,或者覆盖SEH来实现溢出利用的,而在本文即将讲到及测试所使用的利用技术中,并没有直接运用到覆盖EIP或者SEH。我们将通过覆盖一可控制的内存地址,进而实现任意的DWORD覆写。如果你对栈溢出的认识还没有达到中/高等水平,那么我建议你先集中精力去学习一下。本文所讲述的利用技术均是些年过已久的旧技术,如果你有什么新的利用技术

2、,记得分享一下。阅读本文前你需要具备以下条件:●WindowsXPSP1;●调试器(OllyDebugger,ImmunityDebugger,windbg等等);●C/C++编译器(DevC++,lcc-32,MSvisualC++6.0);●脚本语言执行环境(本文使用python,你也可以使用perl);●大脑;●具备汇编和C语言知识,并懂得如何用调试器去调试它们;●OllyDebugger插件HideDbg,或者ImmunityDebugger的!hidedebug命令插件;●时间。我们在本文主

3、要注重于基础知识,这些技术可能因有些过时而未在“现实世界”中使用,但有一点你必须记住,如果你想提高技术,就必须知晓过去,并取其所长来为己所用!堆的定义及其在XP下的工作原理堆是进程用于存储数据的场所,每一进程均可动态地分配和释放程序所需的堆内存,同时允许全局访问。需要指出的是,栈是向0x00000000生长的,而堆是向0xFFFFFFFF生长的。这意味着如果某进程连续两次调用HeapAllocate()函数,那么第二次调用函数返回的指针所指向的内存地址会比第一次的高,因此第一块堆溢出后将会溢出至第二块

4、堆内存。对于每一进程,无论是默认进程堆,还是动态分配的堆都含有多个数据结构。其中一个数据结构是一个包含128个LIST_ENTRY结构的数组,用于追踪空闲块,即众所周知的空闲链表FreeList。每一个LIST_ENTRY结构都包含有两个指针,这一数组可在偏移HEAP结构0x178字节的位置找到。当一个堆被创建时,这两个指针均指向头一空闲块,并设置在空表索引项FreeList[0]中,用于将空闲堆块组织成双向链表。我们假设存在一个堆,它的基址为0x00650000,第一个可用块位于0x00650688

5、,接下来我们另外假设以下4个地址:1.地址0×00650178(Freelist[0].Flink)是一个值为0x00650688(第一个空闲堆块)的指针;2.地址0x006517c(FreeList[0].Blink)是一个值为0x00650688(第一个空闲堆块)的指针;3.地址0x00650688(第一个空闲堆块)是一个值为0×00650178(FreeList[0])的指针;4.地址0x0065068c(第一个空闲堆块)是一个值为0×00650178(FreeList[0])的指针;当开始分配

6、堆块时,FreeList[0].Flink和FreeList[0].Blink被重新指向下一个刚分配的空闲堆块,接着指向FreeList的两个指针则指向新分配的堆块末尾。每一个已分配堆块的指针或者空闲堆块的指针都会被更改,因此这些分配的堆块都可通过双向链表找到。当发生堆溢出导致可以控制堆数据时,利用这些指针可篡改任意dword字节数据。攻击者借此就可修改程序的控制数据,比如函数指针,进而控制进程的执行流程。借助向量化异常处理(VEH)实现堆溢出利用首先看下下面的heap-veh.c代码:#includ

7、e#includeDWORDMyExceptionHandler(void);intfoo(char*buf);intmain(intargc,char*argv[]){HMODULEl;l=LoadLibrary("msvcrt.dll");l=LoadLibrary("netapi32.dll");printf("Heapoverflowprogram.");if(argc!=2)returnprintf("ARGS!");foo(argv[1]

8、);return0;}DWORDMyExceptionHandler(void){printf("Inexceptionhandler....");ExitProcess(1);return0;}intfoo(char*buf){HLOCALh1=0,h2=0;HANDLEhp;__try{hp=HeapCreate(0,0x1000,0x10000);if(!hp){returnprintf("Failedtocreateheap.");}h1=H

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。