问答题
.[说明]
阅读下面程序,回答下列问题。
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语言函数库、程序指针
完整性检查、堆栈向高地址方向增长等。
【答案解析】