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、實驗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、不得將用於考試的直接涉及答案的文件、以及生成考題的腳本放入考試系統磁盤中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章