linux中生成考核用的GPT分区结构样例(二)

简介:

第一部分:面向被考核者

实验说明:

        已知有大小约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  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 :
       =  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、不得将用于考试的直接涉及答案的文件、以及生成考题的脚本放入考试系统磁盘中。





本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/1943210,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Linux Shell C语言
【Shell 命令集合 磁盘维护 】Linux 分区管理的工具 sfdisk命令使用教程
【Shell 命令集合 磁盘维护 】Linux 分区管理的工具 sfdisk命令使用教程
30 1
|
2月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 管理硬盘分区 mpartition命令使用教程
【Shell 命令集合 磁盘维护 】Linux 管理硬盘分区 mpartition命令使用教程
37 1
|
3月前
|
Linux
Linux目录操作——详细样例
Linux目录操作——详细样例
29 0
|
2月前
|
监控 Linux Shell
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
40 1
|
2月前
|
存储 安全 Linux
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
28 0
|
21天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
22 0
|
2月前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
48 0
|
12天前
|
Linux
linux系统如何使用GPT工具进行分区
linux系统如何使用GPT工具进行分区
|
3月前
|
Linux
linux tree命令找不到:如何使用Linux Tree命令查看文件系统结构
linux tree命令找不到:如何使用Linux Tree命令查看文件系统结构
39 0
|
4月前
|
Linux 调度 索引
Linux内核源码的组织结构
Linux内核源码的组织结构