谢@武大郎邀。我觉得你邀请我很有道理,因为到目前为止我看到的其他所有答案都不太对劲。
Eric D对内存溢出的比喻很好,可惜答错了“内存泄漏”。其他同学内存泄漏都说得对。我这里重点谈谈内存溢出。
内存溢出就是内存越界。内存越界有一种很常见的情况是调用栈溢出(即stackoverflow),虽然这种情况可以看成是栈内存不足的一种体现。但内存溢出并不一定跟内存分配有什么关系,因为还有一种情况是缓冲区溢出。所以赵北云、Kifile、戴帽子的狗、武大郎、支浩宇、韩葆-逸松都想到内存分配上去了,误解了“内存溢出”的本意。
在C/C++中,无论栈溢出还是缓冲区溢出都是安全漏洞的温床。
比如说C/C++标准库有个strcpy,会一直复制内存,直到遇到\0。比如如果你用C++写了一个游戏服务器,其中读取客户端网络包的代码写成这样:
constintMAX_LENGTH=16;boolis_administrator=false;chardestination[MAX_LENGTH];std::stringsource=read_string_from_client();strcpy(destination,source.c_str());
那么如果黑客构造出的source长于16字节,那么就会修改到destination之外的内存。很多平台的栈变量是跟按地址顺序倒着分配的。所以destination溢出以后会修改先前定义的变量。比如黑客可以用这个办法把is_administrator修改成true。
这种情况就是缓冲区溢出攻击。
假如黑客黑掉服务器之后,把你的服务端程序偷出来开私服。由于私服泛滥,游戏失败了。于是你的新游戏决定抛弃了C++,改用C99标准的C语言。这次你这样写:
intlength=read_int_from_client();charbuffer[length];intdata=read_int_from_client();
这里会在栈上分配length字节的空间,然后再往栈顶放上一个data。当length很大时,会把data挤到栈空间之外。这种情况下,假如编译器生成的代码没有越界检查的话,那么黑客只要用客户端发送特定的length和data组合,就能够改写服务器的任意内存。黑客通常会修改服务器代码的机