reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
145
vendor-new/rev-skills/.claude/skills/re-triage/SKILL.md
Normal file
145
vendor-new/rev-skills/.claude/skills/re-triage/SKILL.md
Normal file
@@ -0,0 +1,145 @@
|
||||
---
|
||||
name: re-triage
|
||||
description: >
|
||||
文件初步勘察:file/哈希(sha256/md5)/熵/strings/架构识别。
|
||||
触发词:先看看这文件、triage、初勘、这是什么文件、hash
|
||||
capabilities: [triage]
|
||||
---
|
||||
|
||||
# 文件初步勘察(triage)
|
||||
|
||||
## 何时使用 / 何时不用
|
||||
|
||||
- 用:刚拿到未知样本的第一步;判断文件真实类型与架构;任何分析开始前的哈希存证;熵值评估是否加壳/加密
|
||||
- 不用:已确定文件类型、只需深挖结构(直接走对应格式技能 [[re-format-pe]] / [[re-format-elf]] / [[re-format-macho]]);只需函数逻辑(走反编译技能)
|
||||
- 不用:样本已确认带壳、目标直接是脱壳(走 [[re-anti-analysis]] 域)
|
||||
|
||||
## 工具准备
|
||||
|
||||
所有工具先验证再使用。参考 [[re-analyze/platform-tips]] 最高原则(静态分析可免沙箱,但涉及运行一律沙箱)。
|
||||
|
||||
### file —— 文件类型判定
|
||||
|
||||
- Linux: `apt install file` / `dnf install file` / `pacman -S file`(多数发行版自带)
|
||||
- macOS: `brew install file`(自带 /usr/bin/file)
|
||||
- Windows/WSL: WSL 内用 Linux 版;Windows 本机用 Git for Windows 自带 file 或第三方版
|
||||
- 验证: `file --version`
|
||||
|
||||
### sha256sum / md5sum —— 哈希存证
|
||||
|
||||
- Linux: coreutils 自带(无则 `apt install coreutils` / `dnf install coreutils` / `pacman -S coreutils`)
|
||||
- macOS: 自带,用 `shasum -a 256` 或 `md5`
|
||||
- Windows/WSL: WSL 内 Linux 版;Windows 本机 PowerShell: `Get-FileHash -Algorithm SHA256`
|
||||
- 验证: `sha256sum --version`
|
||||
|
||||
### strings —— 关键字符串提取
|
||||
|
||||
- Linux: binutils 自带(`apt install binutils` / `dnf install binutils` / `pacman -S binutils`)
|
||||
- macOS: `brew install binutils`(命令带 `g-` 前缀,如 `gstrings`)或 `llvm-objdump --strings`
|
||||
- Windows: Sysinternals `strings64.exe`(choco: `choco install sysinternals`),或 WSL 内 Linux 版
|
||||
- 验证: `strings --version`(Linux)/ `gstrings --version`(macOS brew)
|
||||
|
||||
### objdump / readelf —— 架构与头信息确认
|
||||
|
||||
- Linux: `apt install binutils` / `dnf install binutils` / `pacman -S binutils`
|
||||
- macOS: `brew install binutils`(`gobjdump`)或 `brew install llvm`(`llvm-objdump`)
|
||||
- WSL: Linux 版直接可用
|
||||
- 验证: `objdump -V` / `readelf --version`
|
||||
|
||||
### xxd —— 十六进制查看
|
||||
|
||||
- Linux: `apt install xxd` / `dnf install vim-common` / `pacman -S xxd`
|
||||
- macOS: `brew install xxd`
|
||||
- WSL: Linux 版
|
||||
- 验证: `xxd -v`
|
||||
|
||||
### ent / python —— 熵计算
|
||||
|
||||
- `ent`: `apt install ent`(Debian/Ubuntu);dnf/pacman 无官方包 → 用 python 方案
|
||||
- python(跨平台兜底,推荐): `pip install --user` 无需依赖,直接写脚本或一行命令:
|
||||
```sh
|
||||
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+
|
||||
|
||||
## 操作步骤
|
||||
|
||||
按顺序执行,每步记下结果。
|
||||
|
||||
1. **file 判定格式**:
|
||||
```sh
|
||||
file sample.bin
|
||||
```
|
||||
记录 Magic、格式(PE32/PE32+、ELF 32/64-bit LSB、Mach-O arm64…)、架构。file 结论不可尽信——魔数可伪造,随后用 objdump 交叉验证:
|
||||
```sh
|
||||
objdump -f sample.bin # 打印头信息与架构
|
||||
```
|
||||
ELF 类可加 `readelf -h sample.bin` 看 Machine 字段。
|
||||
|
||||
2. **哈希存证(先做再动文件)**:
|
||||
```sh
|
||||
sha256sum sample.bin > sample.sha256
|
||||
md5sum sample.bin
|
||||
```
|
||||
输出保存为 `sample.sha256`,写入分析笔记。之后对文件的任何修改(patch/脱壳产物)都要能与原始哈希对照。
|
||||
- **带壳样本:脱壳前记五件套基线**——确认带壳(转 [[re-anti-analysis]])后、动手脱壳前,除 SHA256 外记录:**PE timestamp**(TimeDateStamp)、**EP RVA**(AddressOfEntryPoint)、**section hash**(各节 VirtualSize 与数据 hash)、**import table**(DLL 名 + 导入 API 清单,`objdump -p` / pefile 导出)。脱壳前后对照这份基线,是判断"是否达到可分析状态"的依据([[re-unpack-simple]] / [[re-unpack-advanced]])。
|
||||
|
||||
3. **strings 提取关键串**:
|
||||
```sh
|
||||
strings -n 6 sample.bin | head -100
|
||||
```
|
||||
- 找:可读文件名/URL/路径、`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'`
|
||||
|
||||
4. **熵评估**:
|
||||
```sh
|
||||
ent sample.bin
|
||||
# 或 python 一行脚本(见工具准备)
|
||||
```
|
||||
- 熵 > 7.0 bits/byte:可疑加壳/加密/压缩 → 下一步按 [[re-anti-analysis]] 路径处理
|
||||
- 熵 4.5-7.0:混合内容,正常可执行文件常见区间,继续
|
||||
- 熵 < 4.5:多为明文数据/未压缩代码
|
||||
- 分节评估更准:用 `objdump -h` 或 pefile 按节算熵(壳的特征是某些节熵极高)
|
||||
|
||||
5. **安全特性与编译器识别**:
|
||||
```sh
|
||||
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' # 编译器特征
|
||||
```
|
||||
- 编译器识别辅助后续判断:MSVC 常见 `__security_cookie`,GCC/Clang 常见 `__stack_chk_fail`(canary 形态不同)
|
||||
- 加密常量检测转 [[re-crypto-id]](AES S-box / TEA delta 指纹)
|
||||
- 安全特性写入输出契约的 sections 摘要,供 [[re-vuln]] / 报告引用
|
||||
|
||||
6. **决定下一步**:
|
||||
- 正常格式 + 熵正常 → [[re-format-pe]] / [[re-format-elf]] / [[re-format-macho]](按类型)
|
||||
- 熵异常 / 节名可疑(UPX0/.aspack)→ 转 [[re-anti-analysis]] 先确认壳
|
||||
- 目标是动态行为 → 沙箱内 [[re-tracing]] + [[re-gdb]](见 [[re-analyze/platform-tips]] 最高原则)
|
||||
|
||||
7. **输出契约**:按 [[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),不套文件域字段。
|
||||
|
||||
## 跨域联合
|
||||
|
||||
- [[re-binary-core]]:工作流第 2 步固定调用本技能
|
||||
- [[re-malware]] / [[re-firmware]] / [[re-mobile]] / [[re-ctf]]:各网关接手样本的第一步都是初勘
|
||||
- 本技能结论(RE_TRIAGE 结果)决定后续格式技能选择,是全部动态分析前的强制前置
|
||||
|
||||
## 常见坑与陷阱
|
||||
|
||||
- **熵高 ≠ 必然加壳**:压缩数据(UPX 壳内压缩段、zlib 资源段)熵同样 >7,需结合节名与导入表判断,不要单凭熵值定性
|
||||
- **strings 中文环境编码**:中文串常为 GBK 或 UTF-16LE,默认 `strings` 输出乱码/丢失——按 `-e` 参数指定编码,必要时 `xxd` 目测
|
||||
- **hash 先做再动文件**:任何分析前先 sha256 存证;动态执行会污染样本文件,没有原始哈希就无法对照
|
||||
- 大文件 strings 全量输出可达数百 MB → 先 `-n` 设最小长度并 `head` 截断
|
||||
- **工具报错 ≠ 文件损坏**:现象——`file`/`readelf`/`objdump` 对样本报错或输出中断;原因——对抗样本伪造头字段(节头大小异常、程序头计数离谱、缺失 dynamic section)使解析器失败,并非文件真的损坏;对策——先用 `xxd` 手工核对关键头字段(e_lfanew / e_shoff / e_shnum / e_shentsize),按真实值手工修复后再解析,别把样本当垃圾丢弃
|
||||
- **脱壳前不记基线 → 无法对照**:现象——脱壳后发现 EP 变了、节表增删、导入表变成动态调用,无法判断是壳的正常行为还是脱壳出错;原因——没在脱壳前记录 PE 头 / 节 / 导入表基线;对策——动手前按步骤 2 记录五件套(SHA256 / PE timestamp / EP RVA / section hash / import table),脱壳后逐项对照再判定成败
|
||||
- **字符串可见 ≠ 答案(诱饵 flag)**:现象——`strings` 直接看到 flag/密钥/关键串,提交却不对;原因——高难度样本故意把诱饵放"分析师最容易看到且不会怀疑"的位置(DOS stub、资源段、明显字符串),真实答案藏在协议逻辑/加密数据里;对策——字符串只是线索不是结论,必须交叉验证(代码引用、协议逻辑、多份副本对比);**越容易看到的位置越可疑**,尤其 DOS stub(PE 头里)出现"flag 格式"字符串基本是陷阱
|
||||
Reference in New Issue
Block a user