计算机系统基础
期末大作业指导
• 本作业任务包含以下四方面内容
• 攻击
• 拆弹
• 程序局部性特征分析
• 虚拟内存使用分析
• 压缩包中共提供了两个程序
• exam:实验目标,需要进行破解的程序
• hex2raw:将格式化的十六进制文本转换成ascii码(使用方法见攻击实验)
exam程序结构
• 在main()中经过一系列初始化后(不需要关心),会进入doSomething();
• 在doSomething()中会调用一个可能会产生内存泄露的gilbc库函数gets(char *)
• 当doSomething()正常返回后,会继续调用main()中的sad_ending()
• sad_ending()被调用即意味着任务失败,控制台会有如下输出:
You failed! (T_T)
int main()
{
……
doSomething(); sad_ending();
return 0;
}
char doSomething()
{
char buf[0x20]; puts(“Input sth. please.”); gets(buf);
return buf[0];
}
任务一——攻击
• void entrance(int cookie)
{
if (cookie != COOKIE) { puts(“Opps! Invalid cookie”); sad_ending();
}
…
}
• entrance(int)函数结构如右图所示
• 提示:需要为形参cookie初始化为正确的值才能保证entrance(int)的正确进入
void entrance(int cookie)
{
…
if (skip(0)) {
puts(“You have entered PHASE 0”); phase_0();
puts(“Good! You have passed PHASE 0!”);
}
if (skip(1)) {
puts(“You have entered PHASE 1”); phase_1();
puts(“Great! You have passed PHASE 1!!”);
}
if (skip(2)) {
puts(“You have entered PHASE 2”); phase_2();
puts(“Awesome! You have passed PHASE 2!!!”);
}
…
}
• 需要拆除三个炸弹
• phase_0
• phase_1
• phase_2
• 每次拆弹前都会先进入skip()函数,skip()的具体实现不需要关系
• skip()调用后会在控制台上有如下提示
Skip phase ? (y/n)
• 输入y+回车,skip()返回0,会跳过当前phase
• skip()的设置主要是为了给大家更多的机会绕过某些困难的题目以拿到更多的分数。因此跳过的phase不会得到任何的分数
• 输入n+回车,skip()返回非0,进入当前phase
• 每个phase都需要输入一个password,才能破解。如果破解失败则会导入sad_ending()
• phase_3()中包含了三个函数sum_0,sum_1
void entrance(int cookie)
{
…
if (skip(3)) {
puts(“You have entered PHASE 3”); phase_3();
}
happy_ending();
}
• 这三个函数使用了不同的算法实现了相同的功能
• 在phase_3()中通过相应的输入选择具有最好局部性特征的函数执行
• phase_3()中如果选择错误的函数执行不会有 任何报错提示(最终由教师对答案进行评价), 无论选择正确与否都会导入到happy_ending()
• 对exam程序总体的虚拟内存使用情况进行静态的粗略分析(不需要分析运行时精确内存使用情况,不需要分析stack和heap)
• 使用objdump和readelf等工具分析该elf文件中.text,.data,.bss 和.rodata这四个section,并计算:
• 各section实际使用内存空间大小
• 各section在内存中的起始地址(虚拟地址)
• 各section需要的虚拟页数量(pagesize=4KB)
• 将以上分析结果写入报告
• 所有的输入都需要通过hex2raw进行转换,输入文件统一命名为data
• 采用右面的方式运行程序
$ ./hex2raw < data | ./exam
• hex2raw的使用方法详见“攻击”实验(attack lab)的指导书
• 除doSomething()中使用gets()从标准输入中读入数据外,各phase均使用
fgets()读入数据。
• 无论是fgets()还是gets()在输入时都需要在最后追加换行符‘\n’,对应ascii码 值为0A(十六进制)
• 没有读入换行符时,fgets()和gets()均不会返回
• 建议在data文件中使用/* */对数据进行注释说明
• 在exam中,定义了一些工具函数。为了使大家聚焦核心问题,因此现对一些工具函数进行说明,在反汇编时不需要对这些函数进行分析。
• skip():会出现输入提示,输入y则跳过当前phase,输入n则进入(后面都需 要有回车符号 0A)
• sad_ending(): 程序失败退出
• happy_ending():程序真正的出口
• read_line(char *, int):使用fgets方法从标准输入读入数据,第一个参数为读入缓冲区地址,第二个参数为缓冲区长度
• _strncmp(char *, char *, int):对两个字符串进行比较
• _strlen(char *):计算字符串的长度
• 完成data文件
• 完成报告,报告中应有对各解题步骤的详细分析说明(图文并茂)
• 注意:不是data正确就能够拿到全部分数,报告内容会独立进行评分
• data文件和报告提交到智慧树上(不要打包到一起!!),独立上传这两个文件
• 为保证正确提交,请自行下载提交的文件以确认提交是否正常
• 在截止时间前,可以重复提交,并以最终提交为准
• 原则上,超出截止时间不能提交
• 任务需要在Linux操作系统中完成
• 不要使用mac系统或WSL,运行时会出现问题
• 需要保证系统在exam运行时能够接入互联网
• 无网络连接的条件下exam无法正确运行
• 运行程序时出现 Permission denied
• 程序缺少执行权限
• chmod +x [文件名]
• 建议:压缩包在Linux中解压
• Exam程序输出Network Error
• 网络连接问题,请确认你的Linux系统是否可以正常接入网络
• 测试方法:在Linux的控制台上ping一下百度之类的网站,查看是否响应
ping www.baidu.com
• 如果网络正常仍然报错,请及时反馈老师
• 磨刀不误砍柴工
• 认真阅读资料和指导书,做好知识储备
• 准备好系统环境
• 自省
• 遇到错误首先反思自身,而不是怀疑他人
• 认真
• 越是细节的地方越容易出问题
• 黎明前总是最黑暗的
• 需要信心和坚持
• 请独立完成本次期末大作业
• exam程序运行时会采集一些必要的信息并上传服务器,以杜绝代做的情况
• 每个人拿到的都是“独一无二”的exam,每个人的答案都不相同
• 不要在你的计算机中试图运行其他人的exam,这视为抄袭,两个人都会取消分数
• 在完成期末大作业的过程中,应保证exam始终运行在同一个系统上。不要随意更改exam所运行的系统和虚拟机。
• 如确实需要更改,如系统崩溃,硬件损坏。需提前与教师报备。
x86-64寄存器命名
0-63
0-31
0-15
8-15
0-7
%rax
%eax
%ax
%ah
%al
%rbx
%ebx
%bx
%bh
%bl
%rcx
%ecx
%cx
%ch
%cl
%rdx
%edx
%dx
%dh
%dl
%rsi
%esi
%si
无
%sil
%rdi
%edi
%di
无
%dil
%rbp
%ebp
%bp
无
%bpl
%rsp
%esp
%sp
无
%spl
%r8
%r8d
%r8w
无
%r8b
%r9
%r9d
%r9w
无
%r9b
%r10
%r10d
%r10w
无
%r10b
%r11
%r11d
%r11w
无
%r11b
%r12
%r12d
%r12w
无
%r12b
%r13
%r13d
%r13w
无
%r13b
%r14
%r14d
%r14w
无
%r14b
%r15
%r15d
%r15w
无
%r15b
ASCII码对照表
二进制
十进制
十六进制
名称/意义
0000 000
0
0
00
空字符(Null)
0000 000
1
1
01
标题开始
0000 001
0
2
02
本文开始
0000 001
1
3
03
本文结束
0000 010
0
4
04
传输结束
0000 010
1
5
05
请求
0000 011
0
6
06
确认回应
0000 011
1
7
07
响铃
0000 100
0
8
08
退格
0000 100
1
9
09
水平定位符号
0000 101
0
10
0A
换行键
0000 101
1
11
0B
垂直定位符号
0000 110
0
12
0C
换页键
0000 110
1
13
0D
归位键
0000 111
0
14
0E
取消变换(Shift out)
0000 111
1
15
0F
启用变换(Shift in)
0001 000
0
16
10
跳出数据通讯
0001 000
1
17
11
设备控制一
0001 001
0
18
12
设备控制二
0001 001
19
13
设备控制三
二进制
十进制
十六进制
图形
0010 000
0
32
20
(空格)
0010 000
1
33
21
!
0010 001
0
34
22
"
0010 001
1
35
23
#
0010 010
0
36
24
$
0010 010
1
37
25
%
0010 011
0
38
26
&
0010 011
1
39
27
'
0010 100
0
40
28
(
0010 100
1
41
29
)
0010 101
0
42
2A
*
0010 101
1
43
2B
+
0010 110
0
44
2C
,
0010 110
1
45
2D
-
0010 111
0
46
2E
.
0010 111
1
47
2F
/
0011 000
0
48
30
0
0011 000
1
49
31
1
0011 001
0
50
32
2
0011 001
51
33
3
二进制
十进制
十六进制
图形
0100 0000
64
40
@
0100 0001
65
41
A
0100 0010
66
42
B
0100 0011
67
43
C
0100 0100
68
44
D
0100 0101
69
45
E
0100 0110
70
46
F
0100 0111
71
47
G
0100 1000
72
48
H
0100 1001
73
49
I
0100 1010
74
4A
J
0100 1011
75
4B
K
0100 1100
76
4C
L
0100 1101
77
4D
M
0100 1110
78
4E
N
0100 1111
79
4F
O
0101 0000
80
50
P
0101 0001
81
51
Q
0101 0010
82
52
R
0101 0011
83
53
S
0101 0100
84
54
T
0101 0101
85
55
U
0101 0110
86
56
V
0101 0111
87
57
W
0101 1000
88
58
X
0101 1001
89
59
Y
0101 1010
90
5A
Z
0101 1011
91
5B
[
0101 1100
92
5C
\
0101 1101
93
5D
]
0101 1110
94
5E
^
0101 1111
95
5F
_
二进制
十进制
十六进制
图形
0110 000
0
96
60
`
0110 000
1
97
61
a
0110 001
0
98
62
b
0110 001
1
99
63
c
0110 010
0
100
64
d
0110 010
1
101
65
e
0110 011
0
102
66
f
0110 011
1
103
67
g
0110 100
0
104
68
h
0110 100
1
105
69
i
0110 101
0
106
6A
j
0110 101
1
107
6B
k
0110 110
0
108
6C
l
0110 110
1
109
6D
m
0110 111
0
110
6E
n
0110 111
1
111
6F
o
0111 000
0
112
70
p
0111 000
1
113
71
q
0111 001
0
114
72
r
0111 001
115
73
s