第一部分:面向被考核者
实验说明:
已知有大小约500M-600M之间的某个磁盘镜像,之前使用GPT分区方式划分了一个分区,格式化为NTFS文件系统,分区起始位置和大小不确定。现在故障为:原来的分区被删除,新建了一个大分区,请找出删除的分区,在现有分区表项的基础上改出删除的分区,完成修复工作后,按要求回答问题。
实验要求:
1、利用WINHEX手工方式,修改给定镜像文件的分区结构。
2、分区表部分,只能修改现存分区表项的起始位置、结束位置,其余部分不得做任何修改。
3、修正分区表头校验。
4、修正分区表备份区域。
5、不得使用WINHEX GPT分区模板进行参考修复。
6、除GPT分区表头、GPT分区表、GPT分区表头备份、GPT分区表备份外,镜像文件的其余部分不得修改。
7、修复后生成整个镜像文件的MD5 HASH值。填写的MD5 HASH值全部为大写,不包括0x头标或H尾标,中间不得有任何间隔符号(包括空格、制表符、’-’等符号),以WINHEX软件运算出的HASH值为准。
实验要求:
考试为闭卷形式,不得参考除本材料以外的其他材料;不得使用电脑连接互联网查询信息;考试时间为30分钟;
实验目的:
1、掌握GPT分区结构,掌握GPT分区校验。
2、掌握分区表与备份分区表的区别与关联。
3、熟练使用WINHEX的相关功能。
题库(示例):
1
2
3
4
5
6
7
|
1、实验GPT-2,试卷A,对于GPT2_A_79.tar.gz解压后的镜像文件,找到丢失分区、
修改GPT分区结构后整个文件MD5 HASH值为0x___。
//A9D25AB7C8BE78D7384E1DEA6C626BFE//容易。。
2、实验GPT-2,试卷A,对于GPT2_A_80.tar.gz解压后的镜像文件,找到丢失分区、
修改GPT分区结构后整个文件MD5 HASH值为0x___。
//42F861DE3E683EE7CAE68DD600F04CCF//容易。。
......
|
第二部分:出题过程归档
生成题库过程:
创建python脚本,生成考题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#!/usr/bin/python3
import
os
import
sys
import
random
import
hashlib
import
struct
import
zlib
def
help_exit():
print
(
" 命令格式:"
)
print
(
" python3 %s <NUM>:"
%
sys.argv[
0
])
print
(
" NUM:只可以填写\"A-F\",表示试卷A、试卷B的意思。\n"
)
exit()
#通过抛出异常判断第一个参数是否是A-F
def
is_num_by_except(s):
try
:
a
=
int
(s,
16
)
if
(a>
0
and
a<
=
16
):
return
True
else
:
return
False
except
ValueError:
return
False
if
len
(sys.argv)!
=
2
:
print
(
" ***参数数量或格式错误!"
)
help_exit()
s
=
sys.argv[
1
].upper()
if
is_num_by_except(s):
print
(
"****正在生成试卷%s材料及答案****"
%
s)
else
:
print
(
" ***参数数量或格式错误!"
)
help_exit()
r
=
os.system
rc
=
random.choice
ri
=
random.randint
zero
=
bytearray(
128
*
128
+
512
)
fkaoti
=
open
(
"GPT2-%s_kaoti.txt"
%
s,
'w+'
)
fs
=
open
(
"GPT2-%s_source.img"
%
s,
'wb+'
)
r(
"cd ~/GPT2"
)
for
i
in
range
(
1
,
101
):
fd
=
"GPT2_%s_%d.img"
%
(s,i)
r(
"qemu-img create -f raw %s %dM"
%
(fd,ri(
500
,
600
)))
r(
"losetup /dev/loop0 %s"
%
fd)
r(
"parted -s /dev/loop0 mklabel gpt"
)
r(
"parted -s /dev/loop0 mkpart -s primary ntfs %dM %dM"
%
(ri(
100
,
150
),ri(
350
,
500
)))
r(
"mkfs.ntfs -f /dev/loop0p1"
)
r(
"losetup -d /dev/loop0"
)
#生成MD5 hash
f
=
open
(fd,
'rb+'
)
md5
=
hashlib.md5()
while
True
:
b
=
f.read(
8096
)
if
not
b :
break
md5.update(b)
f.seek(
512
)
d1
=
f.read(
512
)
#GPT分区表头
d2
=
f.read(
128
*
128
)
#GPT分区表区域
pad11,crc1,pad12,headpoi,headbakpoi,pad13,depoi,pad14,ptpoi,pad15,crc2,pad16\
=
struct.unpack(
'<16sI4sQQ8sQ16sQ8sI420s'
,d1)
pad21,pspoi,pepoi,pad22 \
=
struct.unpack(
'<32sQQ%ds'
%
(
128
*
128
-
48
),d2)
d2m
=
struct.pack(
'<32sQQ%ds'
%
(
128
*
128
-
48
),pad21,
128
,depoi,pad22)
crc2m
=
zlib.crc32(d2m)
d1t
=
struct.pack(
'<16sI4sQQ8sQ16sQ8sI'
,\
pad11,
0
,pad12,headpoi,headbakpoi,pad13,depoi,pad14,ptpoi,pad15,crc2m)
crc1m
=
zlib.crc32(d1t)
d1m
=
struct.pack(
'<16sI4sQQ8sQ16sQ8sI420s'
,\
pad11,crc1m,pad12,headpoi,headbakpoi,pad13,depoi,pad14,ptpoi,pad15,crc2m,pad16)
f.seek(
512
)
f.write(d1m)
f.write(d2m)
#中间数据:备份一下分区表尾,参考答案
f.seek(headbakpoi
*
512
-
32
*
512
)
d3
=
f.read(
512
+
128
*
128
)
#再处理分区表备份扇区
d1t
=
struct.pack(
'<16sI4sQQ8sQ16sQ8sI'
,\
pad11,
0
,pad12,headbakpoi,headpoi,pad13,depoi,pad14,headbakpoi
-
32
,pad15,crc2m)
crc1m
=
zlib.crc32(d1t)
d1m
=
struct.pack(
'<16sI4sQQ8sQ16sQ8sI420s'
,\
pad11,crc1m,pad12,headbakpoi,headpoi,pad13,depoi,pad14,headbakpoi
-
32
,pad15,crc2m,pad16)
f.seek(headbakpoi
*
512
-
32
*
512
)
f.write(d2m)
f.write(d1m)
f.close()
r(
"tar -zcf %s.tar.gz %s"
%
(fd[:
-
4
],fd))
os.remove(fd)
fkaoti.write("实验GPT
-
2
,试卷
%
s,对于
%
s.tar.gz解压后的镜像文件,找到丢失分区、修改GPT\
分区结构后整个文件MD5
HASH
值为
0x___
。
/
/
%
s
/
/
容易。。\n" \
%
(s, fd[:
-
4
], md5.hexdigest().upper() ) )
fkaoti.flush()
fs.write(d1)
fs.write(d2)
fs.write(d3)
fs.flush()
fkaoti.close()
fs.close()
|
部署流程:
1、在liunx下执行上述脚本,命令格式为:
1
|
python3 run_GPT2.py A
|
其中第二个参数是脚本名称,第三个参数用于区分哪套试卷。
2、把GPT-x_kaoti.txt导入考试系统。镜像文件按要求放到考试机器上。
3、不得将用于考试的直接涉及答案的文件、以及生成考题的脚本放入考试系统磁盘中。