网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
一种被忽视的构造和整数溢出重现
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式


Michael Howard
Secure Windows Initiative

摘要:Michael Howard 研究了一种常常被忽略的代码构造,这种构造可能会导致严重的缓冲区溢出问题,然后介绍了一种在没有溢出副作用的情况下执行算术运算的替代方法。



谈谈构造
很奇怪,有如此之多的安全指导文档提示人们注意危险的函数。在 C 和 C++ 中,很少有危险的函数,不过,有一件事是肯定的,有许多危险的开发人员正在使用 C 和 C++。

因此,您可能会问,“Michael,您究竟要讨论什么?”

我得承认,我听腻了一些文档说的所谓某些函数是危险的,您应该使用更安全的类型来代替它们。例如,“不要使用 strcpy,它是危险的。您应该改用 strncpy,因为它是安全的。”没有什么比这更远离实际情况的了。有可能使用 strcpy 的代码是安全的,而调用 strncpy 的却是不安全的代码。

像 strcpy 这样的函数是有潜在 危险的,因为源数据比目标缓冲区大,并且它来自不受信任的源。如果源数据来自一个受信任的源,并且在复制之前经过了有效性测试,则调用 strcpy 就是安全的:

void func(char *p) {
   const int MAX = 10;
   char buf[MAX + 1];
   memset(buf,0,sizeof(buf));

   if (p && strlen(p) <= MAX)
      strcpy(buf,p);
}

信不信由您,我正好要在某处用到这个例子。有一种常常被忽略的构造可能会导致缓冲区溢出,它不是函数调用。它是这样的:

while ()
   *d++ = *s++;

此处没有函数调用,这是 DCOM 中导致出现 Blaster worm 蠕虫病毒的编码构造。在 Buffer Overrun In RPC Interface Could Allow Code Execution 中,您可以读到更多关于此病毒的修复程序的内容。

该代码如下所示:

HRESULT GetMachineName(WCHAR *pwszPath) {
    WCHAR  wszMachineName[N + 1])
    LPWSTR pwszServerName = wszMachineName;
    while (*pwszPath != L''\\'' )
        *pwszServerName++ = *pwszPath++;   
    
}

这里的问题在于,while 循环是以源字符串中的一些字符为界的。它没有为目标缓冲区的大小所限制。换句话说,如果源数据不受信任,就会出现缓冲区溢出。

我编写了一段简单的 Perl 脚本来搜索 C 和 C++ 代码中这些类型的构造。请注意,这段脚本标记的每个实例并不是一个缺陷,您需要确定是否源数据是受信任的。

use strict;
use File::Find;

my $RECURSE = 1;

###################################################
foreach(@ARGV) {
  next if /^-./;
  if ($RECURSE) {
      finddepth(\&processFile, 一种被忽视的构造和整数溢出重现_网学
浏览:
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号
);
  } else {
      find(\&processFile, 一种被忽视的构造和整数溢出重现_网学
浏览:
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号
);
  }
}
###################################################
sub processFile {
  my $FILE;
  my $filename = 一种被忽视的构造和整数溢出重现_网学
浏览:
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号
;
  
  if (!$RECURSE && ($File::Find::topdir ne $File::Find::dir)) {
    $File::Find::prune = 1;
    return;
  }
  
  # Only accept C/C++ and header extensions
  return if (!(/\.[ch](?:pp|xx)?$/i));
     
  warn "$!\n" unless open FILE, "<" . $filename;
  
  # reset line number
  $

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号