山东科技大学 软件安全 期末复习
Posted qq_46184019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了山东科技大学 软件安全 期末复习相关的知识,希望对你有一定的参考价值。
-
软件是程序、数据和文档的集合体。
-
网络攻击中,超过 70% 的漏洞来自应用程序软件。
-
移动互联网App存在安全漏洞的比例超过 90%。
-
软件面临的安全威胁分为三类,分别为 软件漏洞、恶意代码 和 软件侵权 。
-
漏洞利用的过程:漏洞发现 、漏洞挖掘 、漏洞验证、漏洞利用、实施攻击。
-
0day漏洞是指已经被发现(有可能未被公开)但官方还没有相关补丁的漏洞。
-
1day漏洞是指厂商发布安全补丁之后但大部分用户还未打补丁时的漏洞,此类漏洞仍然具有可利用性。
-
//存在漏洞,x*y是int型整数,会爆int(溢出) c++和java都存在此问题 long foo(int x, int y) long result= x * y ; return result;
-
int i = -3; unsigned short ui=i; printf("%u",ui); //结果为65533,对65536取模
-
char c1='a'; char c2='b'; char c3=c1+c2; printf("%d,",c3); //结果为-61 ---------->应改为int c3=c1+c2;
-
软件安全错误一般包含六个方面,分别是 需求说明错误 、设计错误、编码错误、测试错误 、配置错误 和 文档错误 。
-
漏洞是引发信息安全事件的根源。
-
软件开发过程中,人为错误称为(软件错误),软件中,软件内部的错误称为(软件缺陷 ),软件运行中,不正常的状态称为(软件故障)。
-
网络空间包含电子设备、基础设施、应用、数据,还有(人)。
-
网络安全框架的核心PDRR模型中,P指( 保护 )、D指( 检测 )。
-
unsigned short int a =32768; short int i=a; //-32768 ~ 32767 printf("%d",i); //-32768 a=65535; i= a; printf("%d",i); // -1
-
int bigint=2147483647; printf("%d",bigint++); //2147483647 unsigned int z=0; printf("%d",--z); //-1
-
unsigned int i=ULONG_MAX; int c= -1; printf("%d", c==i); //1
-
栈帧是系统为进程中的每个(函数)调用划分的一个空间。
-
指向当前栈帧的栈顶的指针是(ESP),指向栈底的是(EBP)。
-
缓冲区溢出指向缓冲区写数据时,没有做(边界)检查,缓冲区的数据超过预先分配的(边界),使得一簇数据覆盖在合法数据上引起的系统异常。
-
数据区存储(全局)变量和(静态)变量。
-
栈增长方向是从(高)地址到(低)地址;堆增长方向是从(低)地址到(高)地址。 //站高
-
Win32系统中,进程空间按功能分为4个区域,从低地址到高地址依次为(栈区)、(堆区)、(代码区)、(数据区)。
-
程序中所用的缓冲区可以是堆、栈、数据区。 √
-
代码区只存放机器代码。 ×------>存放程序汇编后的机器代码和只读数据
-
//改错 1.char s1[5]; // ---->char s1[6]; 2.char s2[]="abcde"; 3.char *p; 4.int i; 5.strcpy(s1,s2); 6.p=(char *) malloc (strlen(s1)); //----> p=(char*)malloc(strlen(s1)+1);
-
char s[10]; //----->cin.width(10) cin>>s; cout<<s<<endl;
-
在C语言的格式化输出中,表示十进制数输出的格式符号是%d,那么表示宽度为6,右对齐的十进制数输出的格式符号是(%6d);表示宽度为6,左补零右对齐的十进制数输出的格式符号是(%06d);输出16进制数的格式符号是(%x);输出字符串的格式符号是(%s);以小数形式输出浮点数的格式符号是(%f);输出十进制无符号数的格式符号是(%u);输出asc码字符的格式符号是(%c);以指数形式输出浮点数的格式符号是(%e);输出指针地址的格式符号是(%p);输出长整型数的格式符号是(%ld)。
-
unsigned short s=4; while (--s >=0) // ---->死循环,应改为while (--s>0) printf("%d",s);
-
在32位系统中,size_t相当于类型 unsigned int最大值是 4294967295(2^32-1)
-
char s1[5]; //---->char s1[6] char s2[5]; //---->char s2[6] char s3[10]; //---->char s3[11] strcpy(s1,"12345"); strcpy(s2,"abcde"); strcpy(s3,s1); strcat(s3,s2); cout<<s1<<endl; cout<<s2<<endl; cout<<s3<<endl;
-
char s[10]; puts("input a string:") ; gets(s); // ----> fgets(s,sizeof(s),stdin) cout<<s<<endl;
-
void test(char *c) short s=strlen(c); //可能会爆short char buf[100]; cout << "strlen(c)=" << strlen(c)<<endl; if(s<100) strcpy(buf,c); else cout<<"overflow!" <<endl;
-
// n赋初值为10 n=(2* ++n)*(n = 'a')+ (n>0?1:-1); //----->答案是2135,但编译器不同意
-
软件生命周期由三个时期构成,分别是**(软件定义)时期、(软件开发)时期和(软件维护)时期**。
-
确定软件完成总目标的是(软件定义)时期,由(系统分析员)负责完成。
-
软件定义时期,一般分为三个阶段,分别是(问题定义)、(可行性研究)和(需求分析)。
-
完成设计和实现任务的是(软件开发)时期,其中系统设计分为(总体设计)和(详细设计)阶段,系统实现分为(编码和单元测试)和(综合测试)阶段。
-
使软件能够满足用户长久需求的是(软件维护)阶段。
-
软件安全中,软件安全测试和开发过程包括:软件安全(需求分析 )、软件安全(设计 )、软件安全( 编码)、软件安全( 测试)、软件安全(部署)。
-
威胁建模可以在软件**(设计)**之初,就帮助发现安全问题,发现风险。
-
解决软件产品自身安全实质性的方法是(威胁建模)。
-
威胁建模有3种,分别是以**(软件)、(安全)和(资产和风险)**为中心。
-
测试人员使用**(威胁模型)**来生成安全测试用例。
-
开发团队使用**(威胁模型)**来实现安全控制和编写安全的代码。
-
威胁建模的作用可以跨越软件生命周期,一个完整的威胁建模是软件**(设计)、(开发)、(测试)、(部署)和运营团队**的代表性输入项。
-
设计阶段,由**(软件架构团队)**识别威胁,建立威胁模型。
-
威胁建模是循环反复的过程。 √
-
软件开发阶段,会发现所有的可能威胁。 ×
-
FILE *file=fopen("test.txt","w"); fprintf(file,"%s","hello"); //后面增加fflusf(stdout) fclose(file); return 0;
-
void change (int * q) //改成int* & q if(q==NULL) q=new int(20); int main() int *p=NULL; change(p); printf("%d\\n,*p);
-
威胁建模过程:确定安全目标,创建应用程序概况图,分解应用程序,确定威胁,威胁评估,确定威胁缓解计划和策略,验证威胁,威胁建档
-
int foo(char * s) char *d=new char[10]; if (s==NULL) //也要释放d return 0; strncpy(d,s,10); delete[] d; return 1;
-
信息安全三大基本属性:保密性,认证性,完整性。
保密性:实现保密性的方法一般是对信息加密和分配访问权限。
完整性:实现完整性的方法一般为预防和检测两种机制。
可用性:为了实现可用性,可以采取备份(实时备份、定时备份)和灾难恢复、应急响应、系统容侵等许多安全措施。
-
char * s="c language"; //----->char s[]="c language"; s[0]='C';
-
函数栈帧包含的信息:前一个栈帧的栈低位置,即前栈帧EBP;该函数的局部变量;函数调用的参数;函数的返回地址RET,用于保存函数调用前指令的位置。
-
栈溢出:越界的数组元素覆盖相邻的局部变量,甚至覆盖前栈帧EBP和函数返回地址RET。
-
格式化串漏洞的根源:C语言不对数组边界进行检查的缓冲区错误。
-
需求分析:头脑风暴,问卷调查和访谈,策略分解,数据分类,主/客体关系矩阵…
-
需求分析:核心安全需求,通用安全需求(安全架构,会话管理),运维安全需求,其它安全需求。
-
STRIDE威胁分类:
假冒 认证性 攻击者能够伪装成另一个用户或身份 验证主体、验证代码或数据
篡改 完整性 在传输、存储或归档过程中能够修改数据 访问控制列表、数字签名
否认 不可否认性 攻击者能够否认攻击 强身份验证、数字签名
信息泄露 机密性 信息泄露给未授权的用户 加密、访问控制列表
拒绝服务 可用性 对于合法用户拒绝提供服务 访问控制列表、授权
特权提升 授权性 攻击者能够跨越最小权限限制 访问控制列表、输入验证
-
Java类加载器:启动类加载器,标准扩展类加载器,路径类加载器,网络类加载器。
-
int **a =new int *[3]; for (int i=0;i<3;i++) a[i]=new int[2]; delete []a; //----->应该删除每个a
-
char *s1="abcd"; char s2[5]; strcpy(s2,s1); if(s1==s2) //改为 if(strcmp(s1,s2)==0) printf("equal!"); else printf("not equal!");
-
Obj * obj=new Obj[10]; delete []obj //释放 OObj * obj=new Obj(10); delete obj //释放
-
代码静态检测:不在计算机上实际执行所检测的程序,而是采用人工审查或类似动态分析的方法。
代码动态检测:实际运行代码时进行检测的方法。
上述知识是考前整理的,考完之后发现只复习上述知识是远远不够的
山东大学软件学院算法设计与分析期末考试回忆版
一、考试时间
2021年12月13日上午10:10-12:10
本次考试是山东大学软件学院2019级软件工程专业大三上算法期末考试
本学期的算法课上课时间为2-7周,9-14周(实际上13周就结束了),第15周考试
考试范围:除了并查集和35章近似算法不考,其他在老师PPT上的内容都是考试范围
二、考试题目
本次算法考试一共有4道大题,每道大题中有多个小题
2.1 第一大题
(1)请解释RAM模型
详细说明见课件
(2)给定递推式:T(n)=T(3n/4) + nlogn,求T(n)的上界
(3)关于NP归约的问题(英文题)
- 解释“归约”的概念
- 证明顶点覆盖归约到集合覆盖
2.2 第二大题
(1)写出强连通算法的伪代码,证明正确性,分析时间复杂度
(2)在一个无向有权图G中,有一颗最小生成树T,在该图中,将一条边e的权值w增加,设计算法求新的最小生成树,阐述算法思想,写伪代码,证明该算法的正确性(本题为英文题)
2.3 第三大题
(1)动态规划:x的初值为1,每一步可对x进行+1或乘2的操作,求对一个大于0的整数n来说,x经过操作后等于n所需的最小步数。写出Bellman方程,伪代码
(2)分析Floyd算法的思想,写伪代码,分析时间复杂度和空间复杂度
2.4 第四大题
(1)合并砖块问题:假设有n堆砖,每堆砖都有对应的块数。需要将这n堆砖合并,只能合并两堆相邻的砖。合并的代价是这两堆砖砖数之和。设计动态规划算法,使合并代价最小,写算法思想,伪代码,分析时间复杂度
(2)求“最小代价”问题:对于一个有向图,每个点都有一个值wi,wi > 0,原点s到该点的代价为s到该点的wi之和。设计算法,求s到每个点的最小代价,写伪代码,分析时间复杂度,证明算法正确性
三、总结
总的来说,这次的算法考试还是有一定难度的,首先是题目量较大,很多题都要写思想,写伪代码,分析时间复杂度,证明等,比较复杂。但是这次的算法题中,有三道题都来自平时的作业,并且老师最后一节课还提到了RAM模型可能需要掌握。因此总的来说,在考试的时候需要安排好时间,并复习好老师布置的作业,将算法过程熟练掌握,重要的证明同样需要熟练掌握。
祝学弟学妹算法考试95+
以上是关于山东科技大学 软件安全 期末复习的主要内容,如果未能解决你的问题,请参考以下文章
山东大学 软件学院 2021-2022 春季学期 《大数据安全》期末考题