首页
社区
课程
招聘
[原创]vs2005对函数局部变量的堆栈检测分析
发表于: 2010-12-23 00:47 71286

[原创]vs2005对函数局部变量的堆栈检测分析

2010-12-23 00:47
71286

前两天,在论坛上看了泉哥的“泉行之路”和笨笨熊的“职场游记”,深受鼓舞,于是决定写下下面这篇鸟文,高手飘过,如有错误,概不负责哦 ,呵呵

   引子:<本文的分析是在debug模式下,呜呜,有人怒了……>
  在vc6.0下,写溢出程序很容易,在.net下由于添加了/GS选项,加入了__security__cookie,溢出就没那么简单了。对_security_cookie我也是最近才研究了一下,才知道:当在函数中buff的长度 <= 4时,编译器是不会在函数中插入cookie进行校验的。于是产生了下面这个天真的想法:
void  foo()
{
  char  buf[4] = {0};    
  strcpy(buf,shellcode);  
}
是不是这样foo函数流程就能被逆转了呢(想法很天真呐,嘿嘿……),于是我就进行尝试了一把,结果挂了,弹出下面这个框框:


  单步调试,才发现编译器加入了函数void __fastcall _RTC_CheckStackVars(void *frame, _RTC_framedesc *v)对函数的局部变量进行校验……呜呼,显然我的想法很傻很天真

    其实微软的编译器是这么检查堆栈变量的:在一个存在局部变量的函数里头,编译器统计函数的局部变量个数num,在栈上分配 192 + num * 2 * sizeof(DWORD) + num*sizeof(DWORD)个字节的栈空间,并将其全部填充为0xCCCCCCCC,当函数结束后,编译器会检测每个局部变量的前4个字节和后四个字节是否为0xCCCCCCCC,如果不是,则说明发生数据覆盖等,跳向错误处理……

  实例演示:
 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
  • 1.jpg (18.00kb,278次下载)
  • 2.jpg (80.58kb,286次下载)
  • 3.jpg (65.69kb,282次下载)
  • 4.jpg (99.43kb,280次下载)
  • 5.jpg (125.00kb,280次下载)
  • 7.jpg (146.95kb,309次下载)
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 239
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好文~细细看
2010-12-23 08:14
0
雪    币: 8221
活跃值: (2806)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不错的文章..学习了..
2010-12-23 08:30
0
雪    币: 57
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的两位……
我会继续努力的。
2010-12-24 08:18
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
赞楼主的钻研精神。
2010-12-27 10:44
0
雪    币: 284
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文,写的清清楚楚
2011-4-10 18:10
0
游客
登录 | 注册 方可回帖
返回
//