问答题 试题五(共8分) 阅读下列说明和代码,回答问题1和问题2,将解答卸载答题纸的对应栏内。 【说明】 某一本地口令验证函数(C语言环境,X86_32指令集)包含如下关键代码:某用户的口令保存在字符数组origPassword中,用户输入的口令保存在字符数组userPassword中,如果两个数组中的内容相同则允许进入系统。 [...] Char origPassword[12]=“lSecret” Char origPassword[12]; [...] Gets(userPassword); /* 读取用户输入的口令*/ [...] If(strncmp(origPassword,userPassword,12)!=0) { Printf(“Password,doesn’t match!/n”); Exit(-1); } [...] /* 口令认证通过时允许用户访问*/ [...]
问答题 【问题1】(4分) 用户在调用gets()函数时输入什么样式的字符串,可以在不知道原始口令“Secret”的情况下绕过该口令验证函数的限制?
【正确答案】只要输入长度为24的字符串,其前12个字符和后12个字符一样即可。
【答案解析】
问答题 【问题2】(4分) 上述代码存在什么类型的安全隐患?请给出消除该安全隐患的思路。
【正确答案】gets()函数必须保证输入长度不会超过缓冲区,一旦输入大于12个字符的口令就会造成缓冲区溢出。 解决思路:使用安全函数来代替gets()函数,或者对用户输入进行检查和校对,可通过if条件语句判断用户输入是否越界。 使用fgets.
【答案解析】