第一部分:面向被考核者

实验说明:

        已知有大小约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、实验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脚本,生成考题

#!/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下执行上述脚本,命令格式为:

        python3 run_GPT2.py A

        其中第二个参数是脚本名称,第三个参数用于区分哪套试卷。

 2、把GPT-x_kaoti.txt导入考试系统。镜像文件按要求放到考试机器上。

 3、不得将用于考试的直接涉及答案的文件、以及生成考题的脚本放入考试系统磁盘中。