代码:
#include <stdlib.h> void study1() { char str[4]; //标记一 gets(str); printf("你输入的内容是\n%s",str); } int main(int argc, char* argv[]) { study1(); system("PAUSE"); return 0; }
不明白的是,在上述"标记一"处,如果str的长度小于等于4,release下为什么没有生成_security_cookie啊?如果长度大于4就会生成_security_cookie,我是在vs 2005下试验的,
求看雪牛牛给解答……
----------------------------------------------------------------------------------------------------------------------
当应用程序启动时,程序的cookie(4字节(dword),无符号整型)被计算出来(伪随机数)并保存在
加载模块的.data节中,在函数的开头这个cookie被拷贝到栈中,位于EBP和返回地址的正前方(位于返
回地址和局部变量的中间)。
[buffer][cookie][savedEBP][savedEIP]
在函数的结尾处,程序会把这个cookie和保存在.data节中的cookie进行比较。
如果不相等,就说明进程栈被破坏,进程必须被终止。
为了尽量减少额外的代码行对性能带来的影响,只有当一个函数中包含字符串缓冲区或使用_alloca函数
在栈上分配空间的时候编译器才在栈中保存cookie。另外,当缓冲区至少于5个字节时,在栈中也不保
存cookie。
在典型的缓冲区溢出中,栈上的返回地址会被数据所覆盖,但在返回地址被覆盖之前,cookie早已经被
覆盖了,因此就导致了exploit的失效(但仍然可以导致拒绝服务),因为在函数的结尾程序会发现cookie
已经被破坏,接着应用程序会被结束。
时间: 2024-12-13 21:02:59