码迷,mamicode.com
首页 > 其他好文 > 详细

调试逆向 【讨论】_security_cookie的问题

时间:2015-09-24 09:25:48      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

代码:
#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 
已经被破坏,接着应用程序会被结束。 

调试逆向 【讨论】_security_cookie的问题

标签:

原文地址:http://www.cnblogs.com/gamekk/p/4834141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!