问答题
试题五阅读下列说明和代码,回答问题1和问题2,将解答写在答题纸的对应栏内。[说明]某一本地口令验证函数(C语言环境,X8632指令集)包含如下关键代码:某用户的口令保存在字符数组origPassword中,用户输入的口令保存在字符数组userPassword中,如果两个数组中的内容相同则允许进入系统。…………………………………………………………………………[…]charorigPassword[12]="Secret";charuserPassword[12];[…]gets(userPassword);/*读取用户输入的口令*/[…]if(Strncmp(origPassword,userPassword,12)!=0){printf("Passworddoesn'tmatch!\n");exit(-1);}[…]/*口令认证通过时允许用户访问*/[…]…………………………………………………………………………
问答题
[问题1]用户在调用gets()函数时输入什么样式的字符串,可以在不知道原始口令“Secret”的情况下绕过该口令验证函数的限制?
【正确答案】正确答案:输入字符串的样式只要满足:前12个字符和后续的12个字符一样,就可以在不知道原始口令“Secret”的情况下绕过该口令验证函数的限制。 即字符串形如:

【答案解析】
问答题
[问题2]上述代码存在什么类型的安全隐患?请给出消除该安全隐患的思路。
【正确答案】正确答案:存在缓冲区溢出攻击的安全隐患。解决思路是检查用户输入的口令的长度信息。
【答案解析】解析:随着软件安全问题的日益突出,各类安全漏洞层出不穷,本题旨在表明安全开发和代码安全的重要性。本题针对C程序设计中最常见的数据越界导致溢出攻击进行知识点的设置,本题考点也是最基础的堆栈溢出漏洞。 [问题1] 根据变量origPassword和userPassword两个变量在堆栈中的布局,可知一旦给origPassword数组提供超过12个字符的内容即可覆盖到userPassword变量,再加上后续的比较函数采用定长的12个字符来比较,因此只要通过gets函数给origPassword和userPassword两个数组提供一样的内容即可。 [问题2] 上述代码的安全问题是典型的堆栈溢出漏洞,可以对数组提供的内容进行长度检验,避免数组越界写入,防止安全漏洞。