参考答案:
【问题1】 (1)穷举攻击 (2) C 【问题2】 【问题3】 【问题4】
(1)基于数据失真的隐私保护技术;
(2)基于数据匿名化的隐私保护技术;
(3)基于数据加密的隐私保护技术。
参数password的值满足:12个字符的字符串,前面8个字符为任意字符,后面4个字符为空字符;或者输入完整的8个任意字符。
使用批准的工具来编写安全正确的程序;禁用不安全的函数来防范因数组没有边界检查而导致的缓冲区溢出;通过静态分析进行程序指针完整性检查。
详细解析:
【问题1】
(1)弱口令可以通过穷举攻击方式来破解。
(2)密码必须符合复杂性要求:启用此策略,用户账户使用的密码必须符合复杂性的要求。
密码复杂性必须符合下列最低要求:
不能包含用户的账户名;
不能包含用户姓名中超过两个连续字符的部分;
至少有六个字符长;
密码总必须包含以下4类字符中的三类字符:
1、英文大写字母(A-Z)
2、英文小写字母(a-z)
3、10个基本数字(0-9)
4、特殊符号(!@#¥%等)
【问题2】
(1)基于数据失真的隐私保护技术:它是使敏感数据失真但同时保持某些关键数据或者属性不变的隐私保护技术,例如,采用交换 (Swapping)、添加噪声等技术对原始数据集进行处理,并且保证经过扰动处理后的数据仍然保持统计方面的性质,以便进行数据挖掘等操作。
(2)基于数据加密的隐私保护技术:它是采用各种加密技术在分布式环境下隐藏敏感数据的方法,如安全多方计算 (SMC)、分布式匿名化、分布式关联规则挖掘和分布式聚类等。
(3)基于数据匿名化的隐私保护技术:它是根据具体情况有条件地发布数据,例如,不发布原始数据的某些值、数据泛化等。
【问题3】
该代码按正常流程走下来,函数verify-password()会返回变量authenticated的值,而只有当其值为0时,会绕过口令。
再来分析strcpy() 函数这个函数,该用来复制字符串,其原型为:
char *strcpy(char *dest, const char *src);
【参数】dest 为目标字符串指针,src 为源字符串指针。
注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。
【返回值】成功执行后返回目标数组指针 dest。
strcpy() 把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。
注意:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出。
主函数中,当valid—flag为0时,会绕过口令,而valid—flag是函数verify-password()的返回值,在函数verify-password()中,其返回值是变量authenticated的值,在返回该值时,使用了strcpy函数将password的值复制到数组buffer中,buffer数组的长度为8个字符,一旦用户输入数据长度大于8个字符就会溢出,溢出部分就会覆盖其他变量的值,从上图堆栈中的数据存储方式可以看出,buffer数组一旦溢出,溢出部分就会覆盖authenticated的值;根据题目意思,只要令溢出部分的值为0即可令authenticated=0,最终使得valid—flag为0,从而满足条件。所以可以先任意输入8个字符堆满buffer数组,再输入时就是溢出部分,可以输入空字符,因authenticated为整形数据,所以将字符赋给整形变量时,会按其ASCII码值进行处理,空字符的ASICC值为0,从而可以把authenticated值变成0满足条件;或者输入完整的任意8个字符,再加上复制结束自动加入的字符串结束标志“\0”,也可导致authenticated值变成0满足条件。
【问题4】
使用批准的工具来编写安全正确的程序,只要在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲区中数据不越界并有效,则就可以避免缓冲区溢出,更不可能使程序跳转到恶意代码上。禁用不安全的函数来防范因数组没有边界检查而导致的缓冲区溢出,C 语言中存在缓冲区溢出攻击隐患的系统函数有很多。例如 gets(),sprintf(),strcpy(),strcat( ),fscanf( ),scanf( ), vsprintf( )等。可以禁用这些不安全函数。通过静态分析进行程序指针完整性检查,在每次在程序指针被引用之前先检测该指针是否已被恶意改动过,如果发现被改动,程序就拒绝执行。