2019護網杯baby_forensic


題目名稱:baby_forensic
題目描述:can you catch the flag?
附件:“data.7z”

2019護網杯初賽的一道取證題,比賽時沒做出來,賽后又研究了一下。

 

獲取profile的類型,因為不同的系統數據結構不一樣,所以需要用--profile=來指定。

這里自動猜解可能的系統類型,一般情況下第一個是正確的,如果不對每個都試一下。

volatility -f /root/data.vmem imageinfo

 

列出所有的進程

volatility -f /root/data.vmem --profile=WinXPSP2x86 pslist

psxview可以查看隱藏進程

 

將內存中的某個進程數據以dmp的格式保存出來

volatility -f mem.vmem --profile=WinXPSP2x86 -p [PID] -D [dump 出的文件保存的目錄]

可以用strings工具打印字符串或者用編輯器打開

 

列舉緩存在內存的注冊表

volatility -f /root/data.vmem --profile=WinXPSP2x86 hivelist

 

hivedump 打印出注冊表中的數據

volatility -f mem.vmem --profile=WinXPSP2x86 hivedump -o 注冊表的virtual地址

 

獲取SAM表中的用戶

volatility -f /root/data.vmem --profile=WinXPSP2x86 printkey -K "SAM\Domains\Account\Users\Names"

 

提取內存中保留的cmd命令使用情況

volatility -f /root/data.vmem --profile=WinXPSP2x86  cmdscan

提示hill_matrix 3,2,2,9,7,7,6,4,9

 

filescan查看文件,grep搜索關鍵詞

volatility -f /root/data.vmem --profile=WinXPSP2x86 filescan | grep 桌面

 

利用dumpfiles提取filescan的文件

volatility -f /root/data.vmem --profile=WinXPSP2x86 dumpfiles -Q 0x0000000001873e40 --dump-dir=/root

 

 

重命名為disk.zip,解壓后是一個img鏡像

進行binwalk分析

binwalk disk.img

 

只是一個鏡像文件,使用mount命令掛載一下,新建一個命名為1的文件夾(umount /root/disk.img命令卸載)

mount disk.img ./1

打開文件發現是usb流量包

 

 wireshark打開后看到Protocol為USB協議,搜索關於usb流量分析的文章

 

USB協議的數據部分在Leftover Capture Data域之中,在Mac和Linux下可以用tshark命令可以將 leftover capture data單獨提取出來

tshark -r /root/1/usb.pcapng -T fields -e usb.capdata > usbdata.txt

第一次運行報錯

解決方法:

1.cd /usr/share/wireshark

2.init.lua用文本編輯器打開。

3.更改disable_lua = false到disable_lua = true。

運行成功,主目錄生成usbdata.txt文件

 

 查看usbdata.txt 發現數據包長度為八個字節

 

查資料知道USB流量分為鍵盤流量和鼠標流量。

鍵盤數據包的數據長度為8個字節,擊鍵信息集中在第3個字節,每次key stroke都會產生一個keyboard event usb packet。

鼠標數據包的數據長度為4個字節,第一個字節代表按鍵,當取0x00時,代表沒有按鍵、為0x01時,代表按左鍵,為0x02時,代表當前按鍵為右鍵。第二個字節可以看成是一個signed byte類型,其最高位為符號位,當這個值為正時,代表鼠標水平右移多少像素,為負時,代表水平左移多少像素。第三個字節與第二字節類似,代表垂直上下移動的偏移。

這里數據包長度是八個字節顯然為鍵盤數據包。

 

網上查找USB協議的文檔,可以找到這個值與具體鍵位的對應關系,根據這個映射表有腳本能解碼得出數據包。

腳本如下:

mappings = { 0x04:"A",  0x05:"B",  0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",  0x0B:"H", 0x0C:"I",  0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",  0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." }
nums = []
keys = open('usbdata.txt')
for line in keys:
    if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
         continue
    nums.append(int(line[6:8],16))
    # 00:00:xx:....
keys.close()
output = ""
for n in nums:
    if n == 0 :
        continue
    if n in mappings:
        output += mappings[n]
    else:
        output += '[unknown]'
print('output :n' + output)

因為不是正常字符會輸出[unknown],影響找字符串,看情況修改為空格。

提示為:'WYTXRXORCQDH'.HILLDECODE

 

顯然3,2,2,9,7,7,6,4,9是希爾密碼加密矩陣,WYTXRXORCQDH是密文

希爾密碼解密即可。

https://www.dcode.fr/hill-cipher

flag{SPVZPLEBASMV}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM