问答题 .[说明]
    阅读下面程序,回答下列问题。
    void function(char *str)
    {
    char buffer[16];
    strcpy(buffer, str);
    }
    void main()
    {
    int t;
    char buffer[128];
    for(i=0;i<127;i++)
    buffer[i]='A';
    buffer[127]=0;
    function(buffer);
    print("This is a test\n");
    }
问答题 1.  上述代码能否输出“This is a test”?上述代码存在什么类型的隐患?
【正确答案】不能。
   代码存在缓冲区溢出错误。
【答案解析】 C语言程序在内存中分为三个部分:程序段、数据段和堆栈。程序段里存放程序的机器码和只读数据;数据段存放程序中的静态数据;动态数据则通过堆栈来存放。在内存中,它们的位置如下图所示。
   
问答题 2.  造成上述隐患的原因是?
【正确答案】(1)function()函数将长度为128字节的字符串拷贝到只有16字节的缓冲区中去。
   (2)strcpy()函数进行字符串拷贝时,没有进行缓冲区越界检查。
【答案解析】
问答题 3.  给出消除该安全隐患的思路。
【正确答案】防范缓冲溢出的策略有:
   ●系统管理防范策略:关闭不必要的特权程序、及时打好系统补丁。
   ●软件开发的防范策略:正确编写代码、缓冲区不可执行、改写C语言函数库、程序指针
   完整性检查、堆栈向高地址方向增长等。
【答案解析】