最近遇到的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符号表生成
-
自动获取:
- Volatility3会自动从Microsoft符号服务器下载PDB文件
- 转换为JSON格式后存储在适当位置
-
手动生成:
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文件
-
下载所需内核版本的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 -
使用Docker环境:
docker run -it --rm -v $PWD:/volatility ubuntu:18.04 /bin/bash -
在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 -
退出Docker并复制符号表:
cp linux-image-5.4.0-84-generic.json ./volatility3/volatility3/framework/symbols/linux
7. 实战案例:2022 Sekai CTF
-
获取特定版本的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 -
在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 -
使用生成的符号表分析内存:
python3 vol.py -f /path/to/dump.mem linux.bash
8. 替代方法
当无法使用banners插件时,可以使用strings命令提取内核版本信息:
strings dump.mem | grep "Linux version"
9. 注意事项
- Volatility3的banners.Banners插件仅适用于Linux内存镜像
- /boot目录下的vmlinux文件通常不可用,需要安装dbgsym包获取调试版本
- 对于较新的内核版本(如Ubuntu 22.04的5.15.x),Volatility2可能不支持,必须使用Volatility3
- 官方提供的Linux符号表不完整,面对Linux内存取证时通常需要自行生成符号表