内存溢出可能有栈溢出(栈内存不够分配),缓冲区溢出(接受用户输入、调用方法返回时,用的缓冲区不够分配),堆溢出(就是对内存不够分配,对象没法建立,没法new)安全
可能会形成安全漏洞:https://www.zhihu.com/question/40560123 杨博的答案服务器
举例:网络
从不受本身控制的来源获取数据,同时又没有对来源的数据大小作出限制,且在程序中毫无检查和校验的状况下使用(调用可能表面上很正确的方法和对象/API),就会形成“栈溢出”、“缓冲区溢出”、“堆溢出”。函数
做者:杨博
连接:https://www.zhihu.com/question/40560123/answer/129719625
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
在C/C++中,不管栈溢出仍是缓冲区溢出都是安全漏洞的温床。spa
好比说C/C++标准库有个strcpy,会一直复制内存,直到遇到\0。好比若是你用C++写了一个游戏服务器,其中读取客户端网络包的代码写成这样:线程
const int MAX_LENGTH = 16; bool is_administrator = false; char destination[MAX_LENGTH]; std::string source = read_string_from_client(); strcpy(destination, source.c_str());
那么若是黑客构造出的source长于16字节,那么就会修改到destination以外的内存。不少平台的栈变量是跟按地址顺序倒着分配的。因此destination溢出之后会修改先前定义的变量。好比黑客能够用这个办法把is_administrator修改为true。
这种状况就是缓冲区溢出攻击。code假如黑客黑掉服务器以后,把你的服务端程序偷出来开私服。因为私服泛滥,游戏失败了。因而你的新游戏决定抛弃了C++,改用C99标准的C语言。此次你这样写:对象
int length = read_int_from_client(); char buffer[length]; int data = read_int_from_client();
这里会在栈上分配length字节的空间,而后再往栈顶放上一个data。当length很大时,会把data挤到栈空间以外。这种状况下,假如编译器生成的代码没有越界检查的话,那么黑客只要用客户端发送特定的length和data组合,就可以改写服务器的任意内存。黑客一般会修改服务器代码的机器码,好比注入一些jmp指令,让线程跳到黑客想执行的函数。游戏
那么这一次你又被“栈溢出”攻击黑掉了服务器。内存