动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络安全 > 教你一招
Tag:卡巴斯基,NOD32,诺顿,金山毒霸,瑞星,江民
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 教你一招 ]的信息

本月文章推荐
.安全技巧教你妙用SSL给IIS也加一.
.文件改名有妙用 网络保密我先行一.
.服务器安全:防范拒绝服务攻击妙招.
.消除上网的恐惧:用网上隐身衣保.
.绕过Anti-Rookit的内核模块扫描技.
.危险无处不在 账号防盗防骗的小经.
.密码攻防实战大演习之Windows密码.
.不怕攻击 家庭上网必学八招安全绝.
.用Windows自带工具打造“免检”木.
.抵抗拒绝服务:巧妙修改Win2k注册.
.隐藏IP就这么简单.
.企业无线局域网安全防护技巧.
.如何使tcp包和udp包穿透网络防火.
.被入侵计算机系统恢复指南.
.执行文件方式加密FLASH文件的解密.
.分析入侵检测系统漏洞 认识黑客入.
.顺藤摸瓜 利用IIS日志追查网站入.
.给你免费系统漏洞检测利器.
.有效率90%以上 防止木马最有效果.
.手把手教你打造黑客也读不懂的安.

利用格式化字符串漏洞对系统发起攻击

发表日期:2007-3-10 |


  【编者按:一个很小的疏忽,就会酿成危机系统安全的大患!】

  什么是格式化字符串攻击?

  格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。当你正在阅读本文的时候,也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个串拷贝到某缓冲区内。他可以写出如下的代码:


printf("%s", str);


  但是为了节约时间和提高效率,并在源码中少输入6个字节,他会这样写:

printf(str);

  为什么不呢?干嘛要和多余的printf参数打交道,干嘛要花时间分解那些愚蠢的格式?printf的第一个参数无论如何都会输出的!程序员在不知不觉中打开了一个安全漏洞,可以让攻击者控制程序的执行,这就是不能偷懒的原因所在。

  为什么程序员写的是错误的呢?他传入了一个他想要逐字打印的字符串。实际上该字符串被printf函数解释为一个格式化字符串(format string)。函数在其中寻找特殊的格式字符比如"%d"。如果碰到格式字符,一个变量的参数值就从堆栈中取出。很明显,攻击者至少可以通过打印出堆栈中的这些值来偷看程序的内存。但是有些事情就不那么明显了,这个简单的错误允许向运行中程序的内存里写入任意值。

  Printf中被忽略的东西

  在说明如何为了自己的目的滥用printf之前,我们应该深入领会printf提供的特性。假定读者以前用过printf函数并且知道普通的格式化特性,比如如何打印整型和字符串,如何指定最大和最小字符串宽度等。除了这些普通的特性之外,还有一些深奥和鲜为人知的特性。在这些特性当中,下面介绍的对我们比较有用:

  * 在格式化字符串中任何位置都可以得到输出字符的个数。当在格式化字符串中碰到"%n"的时候,在%n域之前输出的字符个数会保存到下一个参数里。例如,为了获取在两个格式化的数字之间空间的偏量:


int pos, x = 235, y = 93; 
      printf("%d %n%d\n", x, &pos, y); 
      printf("The offset was %d\n", pos);

  * %n格式返回应该被输出的字符数目,而不是实际输出的字符数目。当把一个字符串格式化输出到一个定长缓冲区内时,输出字符串可能被截短。不考虑截短的影响,%n格式表示如果不被截短的偏量值(输出字符数目)。为了说明这一点,下面的代码会输出100而不是20:


char buf[20]; 
      int pos, x = 0; 
      snprintf(buf, sizeof buf, "%.100d%n", x, &pos); 
      printf("position: %d\n", pos);

  简单的例子
  除了讨论抽象和复杂的理论,我们将会使用一个具体的例子来说明我们刚才讨论的原理。下面这个简单的程序能满足这个要求:


/* 
     * fmtme.c 
     *       Format a value into a fixed-size buffer 
     */ 

    #include <stdio.h> 

    int 
    main(int argc, char **argv) 
    { 
        char buf[100]; 
        int x; 
        if(argc != 2) 
            exit(1); 
        x = 1; 
        snprintf(buf, sizeof buf, argv[1]); 
        buf[sizeof buf - 1] = 0; 
        printf("buffer (%d): %s\n", strlen(buf), buf); 
        printf("x is %d/%#x (@ %p)\n", x, x, &x); 
        return 0; 
    }

  对这个程序有几点说明:第一,目的很简单:将一个通过命令行传递值格式化输出到一个定长的缓冲区里。并确保缓冲区的大小限制不被突破。在缓冲区格式化后,把它输出。除了把参数格式化,还设置了一个整型值随后输出。这个变量是随后我们攻击的目标。现在值得我们注意的是这个值应该始终为1。

  本文中所有的例子都是在x86 BSD/OS 4.1机器上完成。如果你到莫桑比克执行任务超过20年时间可能会对x86不熟悉,这是一个little-endian机器。这决定在例子中多精度数字的表示方法。在这里使用的具体数值会因为系统的差异而不同,这些差异表现在不同体系结构、操作系统、环境甚至是命令行长度。经过简单调整,这些例子可以在其他x86平台上工作。通过努力也可以在其他体系结构的平台上工作。

  用Format攻击

  现在是我们戴上黑帽子开始以攻击者方式思考问题的时候了。我们现在手头有一个测试程序。知道这个程序有一个漏洞并且了解程序员是在哪里犯错误的(直接把用户输入的命令行参数作为snprintf的格式化参数)。我们还拥有关于printf函数深入的知识,知道如何运用这些知识。让我们开始修补我们的程序吧。

  从简单的开始,我们通过简单的参数调用程序。看这儿:


% ./fmtme "hello world" 
    buffer (11): hello world 
x is 1/0x1 (@ 0x804745c)

  现在这儿还没有什么特别的事情发生。程序把我们输入的字符串格式化输出到缓冲区里,然后打印出它的长度和数值。程序还告诉我们变量x的值是1(以十进制和十六进制分别显示),x的存储地址是0x804745c。接下来我们试着使用一些格式指令。在下面的例子中我们打印出在格式化字符串之上栈堆中的整型数值:


% ./fmtme "%x %x %x %x" 
    buffer (15): 1 f31 1031 3133 
    x is 1/0x1 (@ 0x804745c)


对这个程序的快速分析可以揭示在调用snprintf函数时程序堆栈的规划:

Address  Contents       Description 
    fp+8     Buffer         pointer 4-byte address 
    fp+12    Buffer         length 4-byte integer 
    fp+16   &n

上一篇:十大入侵检测系统高风险事件及其对策 人气:4976
下一篇:危险无处不在 账号防盗防骗的小经验 人气:4317
浏览全部漏洞的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号