- 此类题一般会给出raw文件、wmem文件、img文件、dmp文件等内存镜像文件,我们则需要用volatility来解决这种问题
volatility常用命令:
- imageinfo 命令:用于获取内存镜像的摘要信息,分析
--profile
命令的配置文件
volatility -f mem.raw imageinfo
- pslist 命令:用于列出镜像中的进程
volatility -f mem.raw --profile=WinXPSP2x86 pslist
- cmdscan 命令:用于查看cmd中键入的内容
volatility -f mem.raw --profile=WinXPSP2x86 cmdscan
- filescan 命令:扫描文件,可配合 grep 命令进行相关字符定向扫描
# 扫描flag字符相关 volatility -f mem.raw --profile=WinXPSP2x86 filescan | grep flag # 不指定字符 volatility -f mem.raw --profile=WinXPSP2x86 filescan # 扫描后缀文件 volatility -f mem.raw --profile=Win7SP0x86 filescan | grep -E 'png|jpg|gif|zip|rar|7z|pdf|txt|doc'
- memdump/dumpfiles 命令:用于将指定文件导出
volatility -f mem.raw --profile=WinXPSP2x86 memdump -p [PID] -D ./ # [./] 代表当前文件夹
volatility -f mem.raw --profile=WinXPSP2x86 dumpfiles -Q 0x00000000236eb5e0 -D ./ # -Q 后接 [filescan]命令扫描得到的 Offset(P)
- editbox 插件:可以显示有关编辑控件的信息
volatility editbox -f mem.raw --profile=WinXPSP2x86
- userassist 命令:查看运行进程的次数和时间
volatility -f mem.raw --profile=Win7SP0x86 userassist
- clipboard 命令:查看剪切板数据
volatility -f mem.raw --profile=Win7SP0x86 clipboard # 加参数 -v 可以导出 volatility -f mem.raw --profile=Win7SP0x86 clipboard -v > out.txt
- imageinfo 命令:用于获取内存镜像的摘要信息,分析
- 一道比较简单的例题:[高校战“疫”网络安全分享赛] ez_mem&usb
下载附件得到一个流量包,wireshark打开导出http,得到一个php文件,将其扔进winhex把
504B0304
前的多余字符删去并保存,改文件后缀为zip后解压,可得到一个vmem文件,接下来为内存取证的过程
- 首先用 imageinfo 命令分析内存镜像文件
volatility -f data.vmem imageinfo
得知操作系统为 WinXPSP2x86
- 通过 pslist 命令查看所有进程
volatility -f data.vmem --profile=WinXPSP2x86 pslist
可以看到其中有一个 cmd.exe 进程还在运行
- 通过 filescan 命令查看文件,配合 grep 命令和查看相关文件
volatility -f data.vmem --profile=WinXPSP2x86 filescan | grep flag
可以看到有一个 flag.img 文件
- 通过 dumpfiles 命令可以将指定文件导出
volatility -f data.vmem --profile=WinXPSP2x86 dumpfiles -D ./ -Q 0x0000000001155f90
也可通过 memdump 命令导出文件:
volatility -f mem.raw --profile=WinXPSP2x86 memdump -p [PID] -D ./
之后便会在当前文件夹中得到dump下来的文件:
将得到的文件改名为 1.dat 后直接binwalk分离可得到一个加密的压缩包
- 通过 cmdscan 命令查看cmd中内容即可得到解压密码
volatility -f data.vmem --profile=WinXPSP2x86 cmdscan
- 解压后得到 usbdata.txt ,查阅资料可知其为 keyboard scan code ,参考码表即可解得flag,附上解码脚本(也可参照:https://gist.github.com/kawing-ho/0ea76454f80d32d115722b2873791167):
import sys import os usb_codes = { 0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF", 0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL", 0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR", 0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX", 0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$", 0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)", 0x2C:" ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}", 0x32:"#~", 0x33:";:", 0x34:"'\"", 0x36:",<", 0x37:".>", 0x4f:">", 0x50:"<" } def code2chr(filepath): lines = [] pos = 0 for x in open(filepath,"r").readlines(): code = int(x[6:8],16) if code == 0: continue # newline or down arrow - move down if code == 0x51 or code == 0x28: pos += 1 continue # up arrow - move up if code == 0x52: pos -= 1 continue # select the character based on the Shift key while len(lines) <= pos: lines.append("") if code in range(4,81): if int(x[0:2],16) == 2: lines[pos] += usb_codes[code][1] else: lines[pos] += usb_codes[code][0] for x in lines: print(x) if __name__ == "__main__": filepath = "usbdata.txt" code2chr(filepath)
得到flag:flag[69200835784ec3ed8d2a64e73fe913c0]
info 评论功能已经关闭了呐!