在 C 和 C++ 中,缓冲区通常是使用数组和诸如 malloc()
和 new
这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。溢出是指数据被添加到分配给该缓冲区的内存块之外。
在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C 和 C++ 语言。C 和 C++ 语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用 C 和 C++ 编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了 C 和 C++ 使用得非常广泛外,上述这些可能都是不相关的事实;例如,Red Hat Linux 7.1 中 86% 的代码行都是用 C 或 C ++ 编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。
C 和 C++ 附带的大量危险函数或普遍使用的库甚至连检查空间也无法做到。程序对这些函数的任何使用都是一个警告信号,因为除非慎重地使用它们,否则它们就会成为程序缺陷。您不需要记住这些函数的列表;我的真正目的是说明这个问题是多么普遍。这些函数包括 strcpy(3)、strcat(3)、sprintf(3)
(及其同类 vsprintf(3)
)和 gets(3)
。 scanf()
函数集( scanf(3)、fscanf(3)、sscanf(3)、vscanf(3)、vsscanf(3)
和 vfscanf(3)
)可能会导致问题,因为使用一个没有定义最大长度的格式是很容易的(当读取不受信任的输入时,使用格式“%s”总是一个错误)。
其他危险的函数包括 realpath(3)、getopt(3)、getpass(3)、streadd(3)、strecpy(3)
和 strtrns(3)
。 从理论上讲, snprintf()
应该是相对安全的 ―― 在现代 GNU/Linux 系统中的确是这样。但是非常老的 UNIX 和 Linux 系统没有实现 snprintf()
所应该实现的保护机制。
Microsoft 的库中还有在相应平台上导致同类问题的其他函数(这些函数包括 wcscpy()、_tcscpy()、_mbscpy()、wcscat()、_tcscat()、_mbscat()
和 CopyMemory()
)。注意,如果使用 Microsoft 的 MultiByteToWideChar()
函数,还存在一个常见的危险错误 ―― 该函数需要一个最大尺寸作为字符数目,但是程序员经常将该尺寸以字节计(更普遍的需要),结果导致缓冲区溢出缺陷。
另一个问题是 C 和 C++ 对整数具有非常弱的类型检查,一般不会检测操作这些整数的问题。由于它们要求程序员手工做所有的问题检测工作,因此以某种可被利用的方式不正确地操作那些整数是很容易的。特别是,当您需要跟踪缓冲区长度或读取某个内容的长度时,通常就是这种情况。但是如果使用一个有符号的值来存储这个长度值会发生什么情况呢 ―― 攻击者会使它“成为负值”,然后把该数据解释为一个实际上很大的正值吗?当数字值在不同的尺寸之间转换时,攻击者会利用这个操作吗?数值溢出可被利用吗? 有时处理整数的方式会导致程序缺陷。
针对缓冲区溢出的一种简单解决办法就是转为使用能够防止缓冲区溢出的语言。毕竟,除了 C 和 C++ 外,几乎每种高级语言都具有有效防止缓冲区溢出的内置机制。
防止使用在处理字符串时不检查buffer边界的函数,如gets()、strcpy()、strcat()、sprintf()、fscanf()、scanf()、vsprin tf()、realpath()、getopt()、getpass()、streadd()、strecpy()和strtrns(),同样,避免使用execlp()和execvp()。永远不要用system()和popen()系统调用;
分享到:
相关推荐
C++缓冲区溢出实验 war-ftp1.65 OllyDBG patternCreate.pl patternOffset.pl
c/c++防止c/c++防止缓冲区溢出教程源代码 缓冲区溢出教程源代码
顶尖高手讲的缓冲区溢出漏洞原理及实例代码分析,C,汇编。千万别错过,很难得的资料哟
缓冲区溢出是很容易被攻击者利用的攻击,在被覆盖的指令地址位置上编写自己的攻击代码,被攻击方程序运行时,会跳转到攻击者编写的代码位置上,开始运行攻击方的代码,从而攻击者实现了攻击与破坏。
缓冲区溢出实验 有助于linux的学习、对缓冲区的了解,对程序编译、结构、运行过程的了解
缓冲区溢出测试的应用 用C++实现了一定程度的缓冲区攻击
一、缓冲区溢出原理 缓冲区溢出是因为在程序执行时数据的长度超出了预先分配的空间大小,导致覆盖了其他数据的分配区域,从而执行非授权指令,获取信息,取得系统特权进而进行各种非法操作导致程序运行失败、系统宕...
NULL 博文链接:https://capers.iteye.com/blog/407755
BufferOverflow缓冲区溢出攻击原理实例源代码,Visual C++6.0环境下调试通过
C++Q版缓冲区溢出教程
2、缓冲区溢出的产生 3、缓冲区溢出的后果 4、通过安全的编程技术来防止技术措施 4.1 C编程中的主要陷阱 4.2 避免使用gets() 4.3 慎重使用strcpy() 4.4 慎重使用strcat(),sprintf()和vsprintf() 4.5 慎重使用...
漏洞缓冲区溢出攻击公开课视频教学
本文主要以《深入理解计算机》3.38题为例,详细地介绍了该题目的解题过程,主要目的是利用程序缓冲区溢出以达到改变程序的输出(攻击程序)。 要解决这类题目,需要对过程调用的栈帧变化、指令的作用有较深入的了解...
1.本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备。 输入命令安装一些用于编译 32 位 C 程序的软件包 Sudo apt-get update
米111111111111111111111
1.2 啤酒和杯子――缓冲区溢出原理 8 1.3 神秘的Windows系统 10 1.4 ShellCode编写简介 17 1.5 窥豹一斑――本地缓冲区溢出简单利用 21 1.6 小结——摘自小强的日记 28 1.7 首次实战――FoxMail溢出漏洞编写 29 1.8 ...
缓冲区溢出教程(基于JMP ESP) 里面有示例代码(5个工程,Server,shellcode sender... ..), 含有一个演示的ppt(Readonly) 运行后,在机器上创建账户H,无害,有密码。 环境 XP,VC6。
以容易出现溢出的C/C++源码为例,构造相应的检测模型,结果表明:该检测模型相比已有检测方案,可以更加有效地检测出缓冲区溢出漏洞;同时,该方法对程序代码中的危险函数调用和溢出过滤机制也能进行有效识别从而降低误报...
编译器:visual c++.net 2003 由于操作系统的补丁太多,即使与我相同的系统也可能需要修改LoadLibrary、GetProcAddress、VirtualAlloc和"jmp esp"指令的地址。 请谨慎修改编译参数,修改参数可能导致修改程序。 请...
Checked C Checked C向C添加了静态和动态检查,以检测或防止常见的编程错误,例如缓冲区溢出和越界内存访问。 该项目的目标是通过maki改进系统编程。Checked C Checked C向C添加了静态和动态检查,以检测或防止常见...