缓冲区溢出报告
1 概述
1.1 编写背景
网络防范技术的日益成熟,使木马、病毒这类恶意代码的植入变得困难。网络黑客开始针对系统和程序自身存在的漏洞,编写相应的攻击程序。其中最常见的就是对缓冲区溢出漏洞的攻击,而在诸多缓冲区溢出中又以堆栈溢出的问题最有代表性。目前,利用缓冲区溢出漏洞进行的攻击已经占到了整个网络攻击次数的一半以上。
对缓冲区溢出漏洞攻击,可以导致程序运行失败、系统崩溃以及重新启动等后果。更为严重的是,可以利用缓冲区溢出执行非授权指令,甚至取得系统特权,进而进行各种非
法操作。如何防止和检测出利用缓冲区溢出漏洞进行的攻击,就成为防御网络入侵以及入侵检测的重点之一。
1.2 参考资料
[1] ipxodi. window系统下的堆栈溢出. 绿盟科技, 绿盟安全月刊第7期, 2000
[2] czy. win2000溢出初步. 绿盟科技, 绿盟安全月刊第43期, 2003
[3] czy. win2000中通过JMP ESP来执行shellcode. 绿盟科技, 绿盟安全月刊第43期, 2003
[4] Only. 缓冲区溢出机理分析. 绿盟科技, 绿盟安全月刊第2期, 1999
[5] 蒋涛. 缓冲区溢出原理及防护. 中科院研究生院, 2005
[6] dspman,Solo,backend. 高级缓冲溢出的使用. 绿盟科技, 绿盟安全月刊第4期, 1999
[7] warning3. *printf()格式化串安全漏洞分析. 绿盟科技, 绿盟安全月刊第12期, 2000
[8] 胡建伟,汤建龙,杨绍全. 网络对抗原理. 西安:西安电子科技大学出版社,2004
[9] 许治坤,王伟,郭添森,杨冀龙. 网络渗透技术. 北京:电子工业出版社, 2005
[10] 蒋卫华,李伟光,杜君. 缓冲区溢出攻击:原理,防御及检测. 博士论文. 西北工业大学计算机科学与工程系. 2003
[11] 邵丹,唐世钢,林枫. Windows平台下的缓冲区溢出漏洞分析. 博士论文. 哈尔滨理工大学测试技术与通信工程学院. 2003
1.3 术语和缩写词
堆栈:堆栈一般是用来传递参数和保存子程序的局部变量,也称为后进先出(LIFO)的数据结构。堆栈的生长顺序与内存的生长顺序相反,即内存的高端是堆栈的低端,内存的低端是堆栈的高端。压栈(PUSH)指往堆栈保存数据,一般保存的是数据或数据的指针。如参数是短整型时,其数值被压入栈;参数是字符串时,指向该字符串的指针被压栈。每一个函数调用都有其栈帧,包括数据、返回地址、EBP和先前的ESP等等。
EBP:基址寄存器,其作用是保存当前线程的栈底指针。
ESP:堆栈指针寄存器,指向栈顶(即最近一次入栈数据单元的首地址)。
EIP:指令指针,存放下一个CPU指令存放的内存地址(一般代码是不能直接访问EIP的值)。
1.4 约定
在下面的叙述中,所有的缓冲区实验均在Microsoft Visual C++ 6.0 ,Microsoft Windows XP(版本:5.1 Build 2600 Service Pack 1 )环境下调试、测试的。
2 Windows的地址空间
本节分析Windows系统的地址空间分布的情况和Windows进程中的内存结构,从而有利于更好的理解缓冲区溢出的原理和设计编写实用的ShellCode。
2.1 Windows内存分配特点
表2-1 Windows内存分配特点
Win2k Win2k-64 Win98
NULL指针① 0x00000000
0x0000FFFF 0x00000000 00000000
0x00000000 0000FFFF 0x00000000
0x00000FFF
DOS/Win16 无 无 0x00001000
0x003FFFFF
用户模式② 0x00010000
0x7FFEFFFF 0x00000000 00010000
0x000003FF FFFEFFFF 0x00400000
0x7FFFFFFF
64k禁止访问③ 0x7FFF0000
0x7FFFFFFF 0x000003FF FFFF0000
0x000003FF FFFFFFFF 无
内存映射文件 无 无 0x80000000
0xBFFFFFFF
内核模式④ 0x80000000
0xFFFFFFFF 0x00000400 00000000
0xFFFFFFFF FFFFFFFF 0xC0000000
0xFFFFFFFF
表注①:NULL指针区域为NULL指针分配而保留的,即用C及C++等语言编写代码时声明未赋初值的指针变量所指向的区域。程序如访问该区域则报错。
②:用户进程空间,EXE文件的映像被加载到其中(起始地址0x00400000),DLL(动态链接库)也被加载到这部份空间。如果DLL或EXE的代码被装入到该范围的某些地址,就能够被执行。访问该区域中没有代码装入的地址将导致“非法访问”错误。
④:对于NT版本以上系统是保留区域,对此区域的任何访问都将导致“非法访问”错误。
③:内核模式,仅供操作系统使用。用于加载设备驱动程序和其它核心级代码。对于从NT版本以上的系统,用户级应用程序(ring 3)访问此区域将导致“非法访问”错误。
2.1.1 Windows NT/2000 的进程的内存分配特点
NT/2000的每一个进程都在启动时分配了4GB(0xFFFFFFFF&#