executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-memdump内存转储与提取:默认转储优先(gcore),直读特例。 触发词:内存转储、dump内存、找密钥、DEX提取
Independent GitHub snapshot · Automated classification · Original documentation governs
参考 [[re-analyze/platform-tips]]「直读 vs 转储」决策表与 Linux 内存转储极端段——默认转储优先,直读仅特例。
apt install gdb / dnf install gdb / pacman -S gdb(gcore 随附)gcore --help / gdb --versiongdb ./target core)、elfutils eu-stack(apt install elfutils)、file coreeu-stack --versionpip install volatility3(命令 vol)——Volatility 3 是当前唯一维护主线;Volatility 2 已于 2025-05-16 被 upstream 归档(只读),仅用于旧 V2-only 插件/profile 的历史镜像或结果复现,需置于隔离的 Python 2 环境,现代镜像勿作常规 fallbackvol -h;vol -f core windows.info 能识别镜像apt install procps psmisc / dnf install procps-ng psmisc / pacman -S procps-ng psmisc(多数自带)ps aux、pkill 可用choco install sysinternals):procdump -accepteula -ma <pid> out.dmp 全进程内存转储(含托管堆)——x64dbg/windbg 可加载分析procdump -accepteula -? 输出 usage;转储产物用 file 确认(dmp/raw 头)默认转储:gcore -o out <pid>(按明文/代码 materialization 定时机):
gcore -o out <pid>
# 或调试器内
gdb -q -p <pid> -ex 'gcore out' -ex detach -ex quit
转储前按 maps 过滤 vsyscall/vdso:
cat /proc/<pid>/maps > maps.txt
grep -E 'vsyscall|vdso|vvar' maps.txt # 这些段必须剔除
# 只保留 r--p / rw-p 可读映射区域作为提取范围
按 [[re-analyze/platform-tips]] Linux 内存转储极端段: [vsyscall](0xffffffffff600000)、[vdso]/[vvar] 读取失败正常,dump 进 core 也只是垃圾页——转储后提取时跳过,或用 maps 白名单方式直读(步骤 5)。
导入 Ghidra/IDA 分析(core 复盘):
gdb -q ./target out # core 复盘: bt / info registers / x/gx $rsp
eu-stack -e out | head -30 # 快速栈回溯
Ghidra: File > Import File 选 core(Ghidra 支持 ELF core 导入),符号/堆栈线索可用。
linux.pslist 等插件只适用于整机镜像(采集方式如 LiME/dd if=/dev/mem),gcore 上按 [[re-mem-forensics]] 流程跑会失败;进程级枚举用 gdb/eu-stack/ELF core 解析与定向提取即可定向提取:密钥/DEX/字符串(magic 扫描):
# DEX 魔数 "dex\n035\0"
grep -abo #x27;dex\n035' out | head
# PEM 私钥头
grep -abo '-----BEGIN' out | head
# 通用字符串
strings -n 8 out | grep -iE 'key|secret|flag|BEGIN'
# 扫描指定地址范围找特定模式
data = open('out','rb').read()
i = data.find(b'\x89PNG') # PNG 魔数
while i != -1:
print("found at", hex(i)); i = data.find(b'\x89PNG', i+1)
密钥提取注意: 密钥可能在堆/栈上碎片化——先定位加密上下文再取(配合 [[re-ghidra]] 看调用点)。
特例直读:maps 定址 → SIGSTOP → pread:
kill -STOP <pid> # 先停住进程防竞态
# 从 maps.txt 拿目标段地址偏移后:
dd if=/proc/<pid>/mem bs=1 skip=0x7f0000000000 count=4096 of=seg.bin 2>/dev/null
kill -CONT <pid>
import os
pid = 1234
f = open(f"/proc/{pid}/mem", "rb")
os.lseek(f.fileno(), 0x7f0000000000, os.SEEK_SET) # maps 定址
data = f.read(4096)
f.close()
/proc/<pid>/mem 偏移是虚拟地址,不是文件偏移——直接 open+read 从 0 开始读必报错(见坑 3)Windows 侧转储(分支补齐):
procdump -accepteula -ma <pid> out.dmp # 全进程内存(含堆),windbg/x64dbg 加载
# 整机物理内存: DumpIt 管理员运行产出 .raw → [[re-mem-forensics]]
minidump 命令)[vsyscall] 只可执行、[vdso] 部分页不可读,gdb/pread 访问报错是预期行为——按 maps 过滤后提取,别当 bug 排查open('/proc/pid/mem').read() 会失败(偏移非法/权限)——必须 maps 定址 + SIGSTOP + chunked preadfile out 确认是 ELF core,再按需定向提取,别整文件导入工具call *%gs:0x10 间接调用断掉;原因——vDSO 地址记录在进程栈 auxv 的 AT_SYSINFO/AT_SYSINFO_EHDR,且 glibc 有缓存,修补 auxv 也不一定能重定位;对策——重建镜像时把 vDSO 相关调用视为必然失效(该页直接跳过),分析以其余映射为准.symtab/.dynsym)或配合 /proc/<pid>/maps 手工重建gcore / 定向提取(见步骤 1/4,默认转储优先),"先保存再继续";需要再现时回到解密循环调用点重新观察(见 [[re-binary-core]] 分析方法论 R19)gcore 报 ptrace: Operation not permitted,/proc/<pid>/mem 打开即失败;原因——kernel.yama.ptrace_scope=1/2 限制跨进程族 attach(非 root 且目标不是自己子进程时);对策——root 运行转储,或临时 sysctl kernel.yama.ptrace_scope=0(用后恢复),或经调试器([[re-gdb]])以允许身份执行