计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-triage【效率与协作】文件初步勘察:file/哈希(sha256/md5)/熵/strings/架构识别。 触发词:先看看这文件、triage、初勘、这是什么文件、hash
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
所有工具先验证再使用。参考 [[re-analyze/platform-tips]] 最高原则(静态分析可免沙箱,但涉及运行一律沙箱)。
apt install file / dnf install file / pacman -S file(多数发行版自带)brew install file(自带 /usr/bin/file)file --versionapt install coreutils / dnf install coreutils / pacman -S coreutils)shasum -a 256 或 md5Get-FileHash -Algorithm SHA256sha256sum --versionapt install binutils / dnf install binutils / pacman -S binutils)brew install binutils(命令带 g- 前缀,如 gstrings)或 llvm-objdump --stringsstrings64.exe(choco: choco install sysinternals),或 WSL 内 Linux 版strings --version(Linux)/ gstrings --version(macOS brew)apt install binutils / dnf install binutils / pacman -S binutilsbrew install binutils(gobjdump)或 brew install llvm(llvm-objdump)objdump -V / readelf --versionapt install xxd / dnf install vim-common / pacman -S xxdbrew install xxdxxd -vent: apt install ent(Debian/Ubuntu);dnf/pacman 无官方包 → 用 python 方案pip install --user 无需依赖,直接写脚本或一行命令:
python3 - <<'EOF'
import math, collections
data = open('sample.bin', 'rb').read()
c = collections.Counter(data); n = len(data)
e = -sum((v/n) * math.log2(v/n) for v in c.values())
print(f"entropy={e:.3f} bits/byte ({len(data)} bytes)")
EOF
/dev/zero 输出熵 ≈ 0.000,对随机文件 ≈ 7.9+按顺序执行,每步记下结果。
file 判定格式:
file sample.bin
记录 Magic、格式(PE32/PE32+、ELF 32/64-bit LSB、Mach-O arm64…)、架构。file 结论不可尽信——魔数可伪造,随后用 objdump 交叉验证:
objdump -f sample.bin # 打印头信息与架构
ELF 类可加 readelf -h sample.bin 看 Machine 字段。
哈希存证(先做再动文件):
sha256sum sample.bin > sample.sha256
md5sum sample.bin
输出保存为 sample.sha256,写入分析笔记。之后对文件的任何修改(patch/脱壳产物)都要能与原始哈希对照。
objdump -p / pefile 导出)。脱壳前后对照这份基线,是判断"是否达到可分析状态"的依据([[re-unpack-simple]] / [[re-unpack-advanced]])。strings 提取关键串:
strings -n 6 sample.bin | head -100
flag/key/secret、错误消息(泄露内部函数名)、Go/Rust 运行时特征(runtime.main、_ZN...)strings 只取 ASCII;UTF-16 串用 strings -e l sample.bin(little-endian 16 位);GBK 中文串先 xxd sample.bin | head 目测编码再决定-n 6 过滤短串,再配合 grep -iE 'http|flag|key|secret|dll|\.so'熵评估:
ent sample.bin
# 或 python 一行脚本(见工具准备)
objdump -h 或 pefile 按节算熵(壳的特征是某些节熵极高)安全特性与编译器识别:
readelf -h sample.bin | grep Type # ET_EXEC 通常为非 PIE;ET_DYN 可能是 PIE 或共享对象
readelf -d sample.bin | grep -i FLAGS_1 # FLAGS_1 含 PIE(DF_1_PIE)才是 PIE 可执行文件
readelf -l sample.bin | grep -A1 GNU_STACK # 栈含 E 权限=缺 NX
readelf -l sample.bin | grep GNU_RELRO # 存在=RELRO 开启(Full 再查 BIND_NOW)
readelf -s sample.bin | grep __stack_chk_fail # 有=canary 开启
strings sample.bin | grep -iE 'GCC:|clang version|Microsoft Visual' # 编译器特征
__security_cookie,GCC/Clang 常见 __stack_chk_fail(canary 形态不同)决定下一步:
输出契约:按 [[re-analyze/analysis-contract]] 输出结构化摘要——核心字段(target_id / sha256 / evidence / findings / unverified)+ 文件域扩展字段(arch / format / entropy / sections / imports_exports / strings_refs / 安全特性),作为下一环节(format / 反编译 / 沙箱)的输入,不重新扫描。非文件目标(协议/模型/设备)按对应域字段出契约(见 [[re-analyze/analysis-contract]] §3.2),不套文件域字段。
strings 输出乱码/丢失——按 -e 参数指定编码,必要时 xxd 目测-n 设最小长度并 head 截断file/readelf/objdump 对样本报错或输出中断;原因——对抗样本伪造头字段(节头大小异常、程序头计数离谱、缺失 dynamic section)使解析器失败,并非文件真的损坏;对策——先用 xxd 手工核对关键头字段(e_lfanew / e_shoff / e_shnum / e_shentsize),按真实值手工修复后再解析,别把样本当垃圾丢弃strings 直接看到 flag/密钥/关键串,提交却不对;原因——高难度样本故意把诱饵放"分析师最容易看到且不会怀疑"的位置(DOS stub、资源段、明显字符串),真实答案藏在协议逻辑/加密数据里;对策——字符串只是线索不是结论,必须交叉验证(代码引用、协议逻辑、多份副本对比);越容易看到的位置越可疑,尤其 DOS stub(PE 头里)出现"flag 格式"字符串基本是陷阱