• 此类题一般会给出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
  • 一道比较简单的例题:[高校战“疫”网络安全分享赛] ez_mem&usb

下载附件得到一个流量包,wireshark打开导出http,得到一个php文件,将其扔进winhex把 504B0304 前的多余字符删去并保存,改文件后缀为zip后解压,可得到一个vmem文件,接下来为内存取证的过程

  • 首先用 imageinfo 命令分析内存镜像文件
volatility -f data.vmem imageinfo

G8PdaR.png

得知操作系统为 WinXPSP2x86

  • 通过 pslist 命令查看所有进程
volatility -f data.vmem --profile=WinXPSP2x86 pslist

G8PDG6.png

G8PsxO.png

可以看到其中有一个 cmd.exe 进程还在运行

  • 通过 filescan 命令查看文件,配合 grep 命令和查看相关文件
volatility -f data.vmem --profile=WinXPSP2x86 filescan | grep flag

G8PgqH.png

可以看到有一个 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下来的文件:

G8P4it.png

将得到的文件改名为 1.dat 后直接binwalk分离可得到一个加密的压缩包

  • 通过 cmdscan 命令查看cmd中内容即可得到解压密码
volatility -f data.vmem --profile=WinXPSP2x86 cmdscan

G8PIRf.png

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]