最近遇到的Linux内核内存取证小分析
字数 1413 2025-08-26 22:11:45

Linux内核内存取证分析技术详解

1. Volatility2与Volatility3的区别

1.1 Volatility2的Profile机制

Volatility2使用Profile作为特定操作系统版本和硬件体系结构(x86、x64、ARM)的分析基础:

  • VTypes:表示C语言数据结构在Python中的定义方式
  • 元数据:包含操作系统名称、内核版本和编译号
  • 系统调用信息:系统调用的索引和名称
  • 常量值:硬编码地址处的全局变量
  • 系统映射:关键全局变量和函数的地址(仅Linux和Mac)

注意:制作Volatility2的Profile建议使用CentOS 7系统,在其他Linux系统(如Ubuntu)上解决依赖性问题较为耗时。

1.2 Volatility3的Symbol Tables机制

Volatility3不再使用Profile,而是采用符号表(Symbol Tables):

  • 符号表格式:JSON格式(.json、.json.gz或.json.xz)
  • 缓存位置:用户主目录下的.cache/volatility3
  • 符号表分类
    • Windows符号表:基于PDB文件的GUID和Age
    • Linux/Mac符号表:基于DWARF调试信息

2. 符号表生成方法

2.1 Windows符号表生成

  1. 自动获取

    • Volatility3会自动从Microsoft符号服务器下载PDB文件
    • 转换为JSON格式后存储在适当位置
  2. 手动生成

    python3 ./volatility3/framework/symbols/windows/pdbconv.py
    

2.2 Linux/Mac符号表生成

使用dwarf2json工具从DWARF文件生成符号表:

./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-4.4.0-137-generic > output.json

注意:

  • 只有--elf选项在Volatility3中可行
  • Sysmap解析的JSON不可用
  • 官方提供的Linux符号表不完整,通常需要自行生成

3. LiME内存提取工具

LiME(Linux Memory Extractor)是Linux内核模块,用于获取临时性内存(RAM):

3.1 编译LiME

tar -zxvf LiME.tar.gz
cd /path/to/LiME/src/
make

3.2 内存抓取

# 进入内核模式抓取内存
insmod lime-`uname -r`.ko path=/path/to/output.lime format=lime

# 抓取完成后退出内核模式
rmmod lime

4. 调试信息工具安装

4.1 安装libdwarf

git clone https://github.com/tomhughes/libdwarf.git
tar -zxvf libdwarf.tar.gz
./configure
make
cd dwarfdump/
make install

4.2 验证安装

dwarfdump -h

5. 内存镜像生成与符号表制作

5.1 编译Volatility工具

cd volatility/tools/linux/
make

注意:可能需要注释掉module.c文件中198-221行的代码解决编译问题

5.2 生成DWARF信息

dwarfdump -di module.ko > module.dwarf

6. 使用Volatility3进行内存分析

6.1 确定内核版本

python3 vol.py -f /path/to/dump.mem banners.Banners

6.2 使用Docker获取dbgsym文件

  1. 下载所需内核版本的dbgsym包:

    wget https://launchpad.net/ubuntu/+archive/primary/+files/linux-image-unsigned-5.15.0-48-generic-dbgsym_5.15.0-48.54_amd64.ddeb
    
  2. 使用Docker环境:

    docker run -it --rm -v $PWD:/volatility ubuntu:18.04 /bin/bash
    
  3. 在Docker中安装dbgsym并生成符号表:

    cd volatility/dwarf2json
    dpkg -i linux-image-unsigned-5.4.0-84-generic-dbgsym_5.4.0-84.94_amd64.ddeb
    ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux5.4.0-84-generic > linux-image-5.4.0-84-generic.json
    
  4. 退出Docker并复制符号表:

    cp linux-image-5.4.0-84-generic.json ./volatility3/volatility3/framework/symbols/linux
    

7. 实战案例:2022 Sekai CTF

  1. 获取特定版本的dbgsym包:

    wget https://launchpad.net/ubuntu/+archive/primary/+files/linux-image-unsigned-5.15.0-43-generic-dbgsym_5.15.0-43.46-generic_amd64.ddeb
    
  2. 在Docker中生成符号表:

    docker run -it --rm -v $PWD:/volatility ubuntu:22.04 /bin/bash
    cd volatility/dwarf2json
    dpkg -i linux-image-unsigned-5.15.0-43-generic-dbgsym_5.15.0-43.46_amd64.ddeb
    ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0-43-generic > linux-image-5.15.0-43-generic.json
    
  3. 使用生成的符号表分析内存:

    python3 vol.py -f /path/to/dump.mem linux.bash
    

8. 替代方法

当无法使用banners插件时,可以使用strings命令提取内核版本信息:

strings dump.mem | grep "Linux version"

9. 注意事项

  1. Volatility3的banners.Banners插件仅适用于Linux内存镜像
  2. /boot目录下的vmlinux文件通常不可用,需要安装dbgsym包获取调试版本
  3. 对于较新的内核版本(如Ubuntu 22.04的5.15.x),Volatility2可能不支持,必须使用Volatility3
  4. 官方提供的Linux符号表不完整,面对Linux内存取证时通常需要自行生成符号表
Linux内核内存取证分析技术详解 1. Volatility2与Volatility3的区别 1.1 Volatility2的Profile机制 Volatility2使用Profile作为特定操作系统版本和硬件体系结构(x86、x64、ARM)的分析基础: VTypes :表示C语言数据结构在Python中的定义方式 元数据 :包含操作系统名称、内核版本和编译号 系统调用信息 :系统调用的索引和名称 常量值 :硬编码地址处的全局变量 系统映射 :关键全局变量和函数的地址(仅Linux和Mac) 注意:制作Volatility2的Profile建议使用CentOS 7系统,在其他Linux系统(如Ubuntu)上解决依赖性问题较为耗时。 1.2 Volatility3的Symbol Tables机制 Volatility3不再使用Profile,而是采用符号表(Symbol Tables): 符号表格式 :JSON格式(.json、.json.gz或.json.xz) 缓存位置 :用户主目录下的 .cache/volatility3 符号表分类 : Windows符号表:基于PDB文件的GUID和Age Linux/Mac符号表:基于DWARF调试信息 2. 符号表生成方法 2.1 Windows符号表生成 自动获取 : Volatility3会自动从Microsoft符号服务器下载PDB文件 转换为JSON格式后存储在适当位置 手动生成 : 2.2 Linux/Mac符号表生成 使用 dwarf2json 工具从DWARF文件生成符号表: 注意: 只有 --elf 选项在Volatility3中可行 Sysmap解析的JSON不可用 官方提供的Linux符号表不完整,通常需要自行生成 3. LiME内存提取工具 LiME(Linux Memory Extractor)是Linux内核模块,用于获取临时性内存(RAM): 3.1 编译LiME 3.2 内存抓取 4. 调试信息工具安装 4.1 安装libdwarf 4.2 验证安装 5. 内存镜像生成与符号表制作 5.1 编译Volatility工具 注意:可能需要注释掉 module.c 文件中198-221行的代码解决编译问题 5.2 生成DWARF信息 6. 使用Volatility3进行内存分析 6.1 确定内核版本 6.2 使用Docker获取dbgsym文件 下载所需内核版本的dbgsym包: 使用Docker环境: 在Docker中安装dbgsym并生成符号表: 退出Docker并复制符号表: 7. 实战案例:2022 Sekai CTF 获取特定版本的dbgsym包: 在Docker中生成符号表: 使用生成的符号表分析内存: 8. 替代方法 当无法使用banners插件时,可以使用strings命令提取内核版本信息: 9. 注意事项 Volatility3的banners.Banners插件仅适用于Linux内存镜像 /boot目录下的vmlinux文件通常不可用,需要安装dbgsym包获取调试版本 对于较新的内核版本(如Ubuntu 22.04的5.15.x),Volatility2可能不支持,必须使用Volatility3 官方提供的Linux符号表不完整,面对Linux内存取证时通常需要自行生成符号表