参考答案:
【问题1】
缓冲区(栈
) 溢出。
不对数组越界进行检查。
【问题2】
(1)stack
(2)push和pop或者压栈和弹栈
(3)高地址
(4)第9行或者authenticated变量
【问题3】
(1)Enable Security Check(/GS)
(2)不起作用
(3)可以检测出漏洞
详细解析:
本题考查软件安全的漏洞类型以及安全开发的知识,是关于代码安全的问题。
【问题1】
这类漏洞是由于函数内的本地变量溢出造成的,而本地变量都位于堆栈区域,因此这类漏洞一般称为栈溢出漏洞。主要是因为C语言编译器对数组越界没有进行检查导致的。
【问题2】
第9行的变量authenticated同样是本地变量,因此位于堆栈(stack) 区域。堆栈结构常见的操作就是push和pop。在数据往堆栈区域写时,都是往高地址写的。在入栈时,则是第9行的变量先入栈在高地址,后续的第10行代码对应的变量buffer后入栈在低地址,因此第9行的变量在高地址。只有这样在往buffer 数组拷贝过多的数据时,才会覆盖掉后续的authenticated变量。
【问题3】
微软的Visual Studio编译器提供了很多的安全编译选项,可以对代码进行安全编译,例如图中Enable Security Check(/GS)可以在栈中添加特殊值,使得一旦被覆盖就会导致异常,从而增加漏洞利用难度。该编译选项针对小于等于4个字节的数组不起保护作用。模糊测试通过发送不同长度的数据给buffer, 可能导致覆盖后续变量和指针值,导致程序异常从而触发监测,因此采用模糊测试的方法是可以检测出此类漏洞的。