《安全编码》期末复习.docx
- 文档编号:18535116
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:60
- 大小:736.55KB
《安全编码》期末复习.docx
《《安全编码》期末复习.docx》由会员分享,可在线阅读,更多相关《《安全编码》期末复习.docx(60页珍藏版)》请在冰点文库上搜索。
《安全编码》期末复习
批注:
注意:
本复习主要是理论的,程序部分同学自行看上课的程序
分析程序的要点是:
1,运行后结果是什么?
可能是多种.
2能否正确运行..
3可能的危害,都要举一个具体的例子
网络安全编程第一讲
怎样理解网络安全编程?
一是网络编程,二是安全编程。
难度非常大。
需要掌握网络协议和编程语言,又要具备安全知识。
编程语言(按层次划分)
是一个非常难以回答的问题,在各个不同层次都有各自的语言。
常见的就有:
1,OS层面:
专用工具:
ftp/telnet/mail等等。
命令组合的shell程序。
其他。
(你能举例吗?
)debug
2,应用层面:
JAVA编程。
C语言编程。
其他语言编程。
(你能举例吗?
)
Python,C#,PHP,JavaScript,C++
3,OS底层C和汇编语言
4,硬件层面汇编语言
语言分类:
编译型和解释型。
(上面提到的计算机语言都是何种类型?
)
1编写源程序。
思想到源程序编辑器Editor
2编译源程序。
源程序到目标(机器)码编译器complier
3链接目标码。
目标码到OS格式的可执行码链接器Linker
4执行可执行码。
在OS下运行执行码。
补充:
编译型语言:
编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。
但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。
现在大多数的编程语言都是编译型的。
编译程序将源程序翻译成目标程序后保存在另一个文件中,该目标程序可脱离编译程序直接在计算机上多次运行。
大多数软件产品都是以目标程序形式发行给用户的,不仅便于直接运行,同时又使他人难于盗用其中的技术,C、C++、C#、Fortran、VF、Pascal、Delphi、Ada都是编译实现的。
解释型语言:
解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。
用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。
与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。
解释程序的优点是当语句出现语法错误时,可以立即引起程序员注意,而程序员在程序开发期间就能进行校正。
对于解释型Basic语言,需要一个专门的解释器解释执行Basic程序,每条语言只有在执行才被翻译。
这种解释型语言每执行一次就翻译一次,因而效率低下。
一般地,动态语言都是解释型的,如Tcl、Perl、Ruby、VBScript、JavaScript等。
混合型:
Java很特殊,Java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后在Java虚拟机上用解释方式执行字节码。
Python的也采用了类似Java的编译模式,先将Python程序编译成Python字节码,然后由一个专门的Python字节码解释器负责解释执行字节码。
(Java虚拟机对字节码的执行相当于模拟一个cpu,而ruby1.8--在虚拟机还未出现前--是通过解释成语法树执行。
)
即:
源程序—>字节码—>字节码解释器
记忆:
问题一、安全概念
怎样讲安全,与你处的位置和环境有关。
计算机语言的安全怎样?
何为安全?
美国军方的基本定义:
过去曾经是或将来会变为攻击来源的个人、团体、组织或外部力量。
黑客Hacker具有不同的技术能力和处事态度。
他们编写漏洞曝光程序,基于好奇和黑客自身的“道德”,对计算机系统进行负责任披露(responsibledisclosure)和完全披露(fulldisclosure),既有利也有害。
骇客Cracker首要目的是以非授权方式进入计算机系统窃取或破坏数据的人。
内部人员insider现任或以前的员工。
他们知道太多的信息。
罪犯Criminal期望通过犯罪来获取利益的人或团体。
(罪犯<>犯罪)
竞争情报从业者competitiveintelligenceprofessional一般也称之为商业间谍。
恐怖分子terrorist对信息系统进行非法攻击或威胁,从而达到其目的人或组织。
信息战崇尚国informationwarrior?
?
?
你是否会成为威胁?
问题二、计算机安全概念
computersecurity阻止攻击者通过未授权访问或使用计算机和网络达到其目的。
开发与配置:
开发安全要求具有安全的设计和无暇的实现。
配置安全要求系统和网络被安全的予以部署。
安全策略securitypolicy为使系统免遭威胁而设定的规则和操作。
安全缺陷securityflaw导致潜在安全风险的软件瑕疵。
软件瑕疵softwaredefect人类思维错误(包括疏忽)被编码到软件中的结果。
漏洞vulnerability允许攻击者违反显式或隐式的安全策略的一组条件。
利用exploit借助软件漏洞来违反一个显式或隐式的安全策略的软件或技术。
缓解措施mitigation能够保护或限制对漏洞进行利用的方法、技术、过程、工具或运行库。
网络安全编程第二讲:
计算机语言的基本问题(看源码)
三个方面:
语言、平台和网络协议。
一、C的基本特征:
生成主存消耗极小的轻量级语言.
危害:
让习惯了其他高级语言的程序员,误以为某些事情C会自动处理,而实际上C并不处理。
特别是Java,Pascal(Ada)等语言的熟练使用者。
这些语言为程序员提供了太多的保护。
代价是更大的程序体和更慢的运行速度。
问题1:
界限保护。
如:
1,C不对数组做任何的越界检查;2,不做溢出和截断处理;3,不会对调用参数的检查。
问题2:
缺乏类型安全。
非专业的讲,类型安全就是计算不改变其类型。
(python下会自动改变类型)
类型安全的概念:
保持性preservation和前进性progress
保持性:
如果变量x的类型是t,那么如果x具有值v,则v的类型也为t.
x=0x30;但x是整型32bit.
前进性:
对一个表达式对其进行计算,不会以非预期的方式进行。
即要么得到一个值(计算结束),要么存在某种方式对其进行继续的计算。
实例:
#include
unsignedchar*pi;
main()
{
inti;
t1();
for(i=0;i<10;i++)printf("\npi[%2d]=%x",i,pi[i]);
}
intt1()
{
inti;
unsignedintpc[100];
pi=(unsignedchar*)pc;
for(i=0;i<10;i++)
pc[i]=i;
}
/**
打印结果:
pi[0]=0
pi[1]=0
pi[2]=0
pi[3]=0
pi[4]=1
pi[5]=0
pi[6]=0
pi[7]=0
pi[8]=2
pi[9]=0
**/
结论:
由上图的结果可知,c语言对数据的类型不会做检查,即缺乏类型的安全,在此处打印时,会根据所给的类型继续计算。
问题3:
宽松的编译处理和代码风格。
C在某些方面太低级。
低级的含义就是接近CPU,而CPU只认地址和长度。
在c中,代码和数据的存放是完全不同的,代码基本上是固定的,而数据非常复杂。
全局变量、局部变量、静态变量等在主存中的位置不同,基本上全局变量是不变的,而局部变量每次都变化,且与调用次数、顺序有关。
实例:
Intp1()
{
intx1,x2;
….
}
intp2()
{
inta1,a2;
…
}
这里,完全有可能,x1就是a1,x2就是a2.
类似,更为复杂的是,如果x与a的类型不一致,同样存在这样的问题。
因为,他们都是局部变量。
问题4:
C遗留代码的处理
C的代码库,还在使用,不能丢弃。
C的某些函数,仍然是标准,还要继续支持。
如strcpy()。
二、其他语言的基本安全问题
问题1:
(高级语言的缺陷)如JAVA解决了很多C具有的问题,但是在实现层次和设计层次时,仍然有安全缺陷。
如:
JAVA可以调用其他语言的程序库。
这样,安全问题更加严重。
最终结论,需要高安全的程序,仍然需要用C来编写。
当然,这时的安全责任完全落在了C程序员身上!
问题2:
运行平台很不安全(平台缺陷)
不论是Win系列还是UNIX家族,都有问题。
问题3:
编译器自身特点和解释器问题
编译器理论上就要求,编译的结果不确定。
如时间优化和空间优化不能同得。
具体例子。
GuP1P2.c
gcc-O3出现p=0循环
缺省出现10次出现10次
VC缺省出现p=0循环
Speed优化出现10次打印
/*
*指针对程序的影响.看结果如何.
*结论:
不确定。
与环境编译都有关系
*在VC.60中Speed优化可以看到与不优化和其他优化结果完全不同。
/FAs
*linux下有同样的结果
*因为i和p的地址在某种环境下是相同的,而其他则不同
*这是理解Fig.1-20中Text/Data/Gap/Stack的好例子
*顾剑2006/10/012011/03/03
*用gcc-O3编译的结果和VC6default的结果一直,
*gcc和VCspeed优化的结果一直.
*有两种不同的结果.一是i和p的地址一致,一是不一致.
*/
#include
intP1(void);
intP2(void);
voidDoTextDataStack(void);
main()
{
DoTextDataStack();
}
/*02*/voidDoTextDataStack()
{
P1();
P2();
}
int*p;
intP2()
{
inti;
printf("pi=%xp=%x\n",&i,p);
for(i=0;i<10;i++)printf("i=%dp=%x\n",i,(*p)--);
return(0);
}
intP1()
{
inti;
p=&i;
return(0);
}
Q问题:
该程序如何变形,得到同样的结论?
这是检查是否真学会的标准.
结论:
1.Debug版下,P2()下的*p正好指向i值的地址,i++与(*p--)相互抵消
Debug版结果
Debug版测试:
可以发现,P1(),P()函数的局部变量值是一致的。
2.Release版下,P2()函数的*p与P1()无关,重新指向了新的数据,所以不影响for循环中的i递减,release版也说明了定义的函数各自无关。
结果如下:
Release版结果
网络安全编程第四讲:
C中的字符串
问题一:
字符串的表示?
字符串定义需要的参数:
1地址;
2长度;
3字符宽度一般字符宽度是1个字节.
宽字符widestring.表示:
L在字符串””前加L.
常见的两种是表示方式:
1地址+长度。
basic中使用
2地址+尾。
C和DOS汇编中使用。
C的尾是NULL=0,DOS是美金符合$
思考:
1两者的优缺点是什么?
2是否还有其他表示方式。
比如C++中的std:
:
basic_string类。
3其他方式造成字符串操作的不同。
问题二:
常见字符串操作的错误
1无界字符串复制错误unboundedstringcopy
(发生于从一个无界数据源复制到一个定长的字符数组)
2差一错误off-by-oneerror
()
3空结尾错误nullterminationerror
4字符串截断stringtruncation
实例:
1无界字符串复制错误unboundedstringcopy的C程序例子:
例子1(p18):
intmain()
{charPassword[9];
puts("Enter8characterpassword:
");
gets(Password);
printf("Passowrd=(%s)",Password);
/**其他程序**/
}
危险性:
谁能保证输入者只会按8个键?
改正理论:
保证程序在任何情况下只接收8个字符。
基本技巧:
把接收分为2个缓存:
一个字符,一个串。
每次只接收一个字符,然后再决定是否写入缓存。
避免方式:
永远不用gets()函数!
例子2(p19):
无界字符串的复制和连接
intmain(intargc,char*argv[])
{charname[2048];
strcpy(name,argv[1]);
strcat(name,”=”);
strcat(name,argv[2]);
…
}
危险性:
谁能保证输入者只会按键盘?
一种改进方式:
利用strlen()测试输入字符串的长度,然后动态地分配内存。
(用实际串长度来申请临时空间)
intmain(intargc,char*argv[])/**19图2-3**/
{char*name=(char*)malloc(strlen(argv[1])+strlen(argv[2])+2);
if(name!
=0)
{strcpy(name,argv[1]);
strcat(name,"=");
strcat(name,argv[2]);
printf("%s\n",name);
/**其他代码**/
}
else{printf("Nomemoryerrorr!
\n");
}
return(0);
}
例子3(p19):
C++程序
#include
intmain(void)
{charbuf[12];
cin>>buf;/**error当输入>11个字符时**/
cout<<“echo:
”< } 2差一错误off-by-oneerror C++版: intmain()/**p20图2-6**/ { chars1[10]; strcpy(s1,"0123456789");/**这里越界**/ char*d1=(char)malloc(strlen(s1));/*错误所在: 这里少申请一个空间(即一个用作结尾的空字符)*/ for(inti=0;i<11;i++){d1[i]=s1[i];} d1[I]='\0'; printf("d1=%s",d1); } C版: #include #include #include intmain() { chars1[10]; inti; char*d1; strcpy(s1,"0123456789");//此处越界,越界过大会影响后面的数据 printf("%s",s1); d1=(char*)malloc(strlen(s1));/*这里少申请一个空间*/ for(i=0;i<11;i++){d1[i]=s1[i];} d1[i]='\0'; printf("d1=%s",d1); } 越界的测试: strcpy(s1,"012345678912345678"); 越界后报错! ! ! 3空结尾错误nullterminationerror #include #include intmain()/**p21图2-7空结尾错误**/ { chara[16]; charb[16]; charc[32]; strcpy(a,"0123456789abcdaa");//此处已经17个字符+'\0' strcpy(b,"0123456789abcdbb"); strcpy(c,a); printf("a=%sb=%sc=%s\n",a,b,c); strcat(c,b);//字符串连接 printf("a=%sb=%sc=%s\n",a,b,c); return(0); } 实验结果 结论: 定义的数组过小,b[]数组的’\0’位存储在了a[]数组内,导致无法打印出a[]的数据来,同理,C[]也类似 课本结论: 声明3个字符的数字没有成功地为结尾处的空字符分配空间。 结果导致,对a的strcopy()操作在数组之外写了一个空字符。 正确的编码结果: #include #include intmain()/**p21图2-7空结尾错误**/ { chara[17]; charb[17]; charc[34]; strcpy(a,"0123456789abcdaa");//此处已经17个字符+'\0' strcpy(b,"0123456789abcdbb"); strcpy(c,a); printf("a=%sb=%sc=%s\n",a,b,c); strcat(c,b);//字符串连接 printf("a=%sb=%sc=%s\n",a,b,c); return(0); } 修正后的结果 /**GuPasswd.c 这是字符串超出后,控制运行结果的例子. 本例子,可以由输入(第一个密码)来修改第二的密码(第二次输入) 顾剑 2013/01/01 **/ #include #include intDoCheckPasswd(void); intmain() { DoCheckPasswd(); } #definePasswdLen8 #defineDeDoCheckPasswd_ intDoCheckPasswd() {inti; unsignedcharP0[PasswdLen+1]; unsignedcharP2s[PasswdLen+1]="qwertyui"; unsignedcharP1[PasswdLen+1]; unsignedcharP1s[PasswdLen+1]="12345678"; unsignedcharP2[PasswdLen+1]; #ifdefDeDoCheckPasswd #defineDispDebugInfo\ printf("\nP1=");\ for(i=0;i<(PasswdLen+4)*2;i++)printf("%2x",P1[i]);\ printf("\nP2=");\ for(i=0;i<(PasswdLen+4)*2;i++)printf("%2x",P2[i]); #else #defineDispDebugInfo #endif #defineGetPasswd(Name,Pin)\ DispDebugInfo\ printf("\nEnter%dcharacterpassword(for%s): ",PasswdLen,Name);\ scanf("%s",Pin);\ DispDebugInfo #defineCheckPasswd(Name,Pin,PDa)\ if(memcmp(Pin,PDa,PasswdLen)==0){printf("\n%sPasswdOK! \n",Name);}\ else{printf("\n%sPasswdError! \n",Name);} //memcmp比较内存的前PasswdLen长度的字符 GetPasswd("P1AA",P1) GetPasswd("P2BB",P2) CheckPasswd("P1AA",P1,P1s); CheckPasswd("P2BB",P2,P2s); return(0); } /* 无调试信息运行: 某次运行结果(P1超出长度) Enter8characterpassword(forP1AA): 1234567890qwertyuiop Enter8characterpassword(forP2BB): ertyuiop P1AAPasswdOK! P2BBPasswdOK! 注意: 本次P1密码=12345678 P2密码=ertyuiop 某次运行结果(P1正常) Enter8characterpassword(forP1AA): 12345678 Enter8characterpassword(forP2BB): qwertyui P1AAPasswdOK! P2BBPasswdOK! 注意: 本次P1密码=12345678 P2密码=qwertyui 有调试信息运行: 某次运行结果(P1超出长度) P1=cccccccccccccccccccccccc71776572747975690cccccc P2=cccccccccccccccccccccccc31323334353637380cccccc Enter8characterpassword(forP1AA): 1234567890qwertyuiop P1=3132333435363738393071776572747975696f700cccccc P2=cccccccccccccccccccccccc31323334353637380cccccc P1=3132333435363738393071776572747975696f700cccccc P2=cccccccccccccccccccccccc31323334353637380cccccc Enter8characterpassword(forP2BB): ertyuiop P1=3132333435363738393071776572747975696f700cccccc P2=6572747975696f700cccccc31323334353637380cccccc P1AAPasswdOK! P2BBPasswdOK! 注意: 本次P1密码=12345678 P2密码=ertyuiop 某次运行结果(P1正常) P1=ccccc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 安全编码 安全 编码 期末 复习
![提示](https://static.bingdoc.com/images/bang_tan.gif)