首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 软件频道>利用格式化字符串漏洞对系统发起攻击

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

2007-03-09 10:29作者:赵彪出处:天极博客责任编辑:原野

  简单的例子

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

/*  
     * 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

  阅读关于 黑客 漏洞 网络安全 的全部文章

关注此文的读者还看过:

返回软件频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络