reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
117
vendor-new/rev-skills/.claude/skills/re-tracing/SKILL.md
Normal file
117
vendor-new/rev-skills/.claude/skills/re-tracing/SKILL.md
Normal file
@@ -0,0 +1,117 @@
|
||||
---
|
||||
name: re-tracing
|
||||
description: >
|
||||
系统调用/函数调用跟踪:strace/ltrace/dtruss。
|
||||
触发词:strace、跟踪系统调用、ltrace、API监控
|
||||
capabilities: [tracing]
|
||||
---
|
||||
|
||||
# 系统调用/函数调用跟踪
|
||||
|
||||
## 何时使用 / 何时不用
|
||||
|
||||
- 用:观察程序运行行为(文件/网络/进程操作);记录系统调用与库调用序列作为证据;定位动态解析的 API(GetProcAddress/dlopen 之后)
|
||||
- 不用:只需内存内容(走 [[re-memdump]]);只需静态逻辑(反编译技能)
|
||||
- 不用:Windows 目标用 APIMonitor/ProcMon(本技能 Linux/macOS 为主)
|
||||
|
||||
## 工具准备
|
||||
|
||||
参考 [[re-analyze/platform-tips]] 最高原则——跟踪即动态执行,默认在沙箱内进行,网络隔离。
|
||||
|
||||
### strace(Linux)
|
||||
|
||||
- Debian/Ubuntu: `apt install strace`
|
||||
- Fedora/RHEL: `dnf install strace`
|
||||
- Arch: `pacman -S strace`
|
||||
- WSL: Linux 包直接可用
|
||||
- 验证: `strace -V`
|
||||
- 常用选项:`-f` 跟子进程、`-o` 写文件、`-e trace=` 过滤、`-s 200` 放大字符串显示(默认 32 字节)、`-x` 非 ASCII 转十六进制、`-y`/`-yy` 把 fd 解析为路径、`-c` 汇总统计、`-p` attach——速查与组合见 [[commands]]
|
||||
|
||||
### ltrace(Linux 库调用)
|
||||
|
||||
- Debian/Ubuntu: `apt install ltrace`
|
||||
- Fedora/RHEL: `dnf install ltrace`
|
||||
- Arch: `pacman -S ltrace`
|
||||
- 验证: `ltrace -V`
|
||||
|
||||
### dtruss(macOS,DTrace 版 strace)
|
||||
|
||||
- macOS 自带(随 Xcode CLT);需要 root 且部分 SIP 场景受限
|
||||
- 验证: `sudo dtruss -c ls / 2>&1 | head` 输出去重调用统计
|
||||
|
||||
### APIMonitor / ProcMon(Windows)
|
||||
|
||||
- APIMonitor: rohitab.com 下载 zip 解压即用
|
||||
- ProcMon: Microsoft Sysinternals —— `choco install sysinternals`(或官网下载)
|
||||
- 验证: 打开 APIMonitor/ProcMon 能列出并附加进程
|
||||
|
||||
## 操作步骤
|
||||
|
||||
1. **strace -f 全进程树跟踪**:
|
||||
```sh
|
||||
strace -f -o trace.log ./target args
|
||||
```
|
||||
`-f` 必须加:跟随 fork/vfork/clone 子进程——不加会漏掉全部子进程行为。
|
||||
`-tt` 加微秒时间戳,`-T` 加每调用耗时(网络等待/慢调用线索);`-s 200` 放大字符串显示(默认 32 字节,路径/参数看不全时必加)。
|
||||
已运行的目标用 attach(看不到 attach 之前的调用):
|
||||
```sh
|
||||
sudo strace -f -p <pid> -o attach.log # attach 需要与目标同权限
|
||||
strace -f -c ./target # 退出时打印系统调用计数/耗时汇总(热点定位)
|
||||
```
|
||||
|
||||
2. **过滤(-e trace=...)**:
|
||||
```sh
|
||||
strace -f -e trace=network,file ./target # 只看网络与文件
|
||||
strace -f -e trace=write,read ./target # 只看读写
|
||||
strace -f -e trace=execve,fork,clone ./target # 只看进程行为
|
||||
strace -f -e trace=!futex ./target # 排除噪声(futex 高频)
|
||||
```
|
||||
过滤规则先白名单后黑名单,控制输出体积(见坑 2)。
|
||||
|
||||
3. **ltrace 库调用**:
|
||||
```sh
|
||||
ltrace -f -o lib.log ./target
|
||||
ltrace -e malloc+free ./target # 只跟踪指定库函数
|
||||
ltrace -l /path/libfoo.so ./target # 跟踪 dlopen 动态加载的库
|
||||
ltrace -f -S ./target # 库调用 + 系统调用一起跟踪
|
||||
ltrace -f -c ./target # 退出时库调用汇总
|
||||
```
|
||||
动态解析的 API(`dlsym` 拿到的函数)不会出现在静态 IAT 里,但会出现在 ltrace 输出中——与 [[re-imports]] 互补。
|
||||
|
||||
4. **输出保存为证据**:
|
||||
```sh
|
||||
strace -f -tt -o evidence/trace-$(date +%s).log ./target
|
||||
# 或
|
||||
ltrace -f -o evidence/libcall.log ./target
|
||||
```
|
||||
每条记录带 pid 与时间戳;分析完成后在笔记中引用文件路径与哈希(样本与日志各存 sha256,见 [[re-triage]])。
|
||||
|
||||
5. **Windows 用 APIMonitor/ProcMon**:
|
||||
- APIMonitor: 运行(管理员)→ 选中目标进程 → 勾选要监控的 API 类(File/Network/Registry/Process)→ 附加,观察调用参数与返回值
|
||||
- ProcMon: 全系统级(文件/注册表/网络/进程事件),先按进程过滤(Process Name 过滤目标名),再按 Operation 过滤
|
||||
- 可疑点: 对注入类 API 连续调用序列(OpenProcess→VirtualAllocEx→WriteProcessMemory→CreateRemoteThread)即恶意行为证据
|
||||
|
||||
## 指令级追踪
|
||||
|
||||
比系统调用级更深一层——指令粒度执行流:
|
||||
|
||||
- **QEMU 插件**:`-plugin` 加载指令级 trace 插件(insn 粒度、call/ret 路径、guest 代码块事件);用途——脱壳后真实路径还原、反混淆(静态混淆无法隐藏实际执行)
|
||||
- **Intel PT**:硬件 trace(`perf record -e intel_pt`)→ 解码(`perf script` 或第三方解析)→ 分支流还原;用途——无插桩开销的完整执行路径
|
||||
- **trace 分析**:热点(执行频次排序)、路径还原(调用链重建)、与 [[re-deobfuscate]] 衔接(按真实路径过滤死代码)
|
||||
- **输出**:指令级执行流摘要(供 [[re-analyze/analysis-contract]] 证据存档)
|
||||
|
||||
## 跨域联合
|
||||
|
||||
- [[re-binary-core]]:工作流第 6 步(行为跟踪)
|
||||
- [[re-malware]]:恶意行为观察(回连/持久化/自启动)
|
||||
- [[re-cracking]]:监控校验/注册相关的 API 调用参数
|
||||
- 与 [[re-imports]] 互补(动态解析 API);发现反调试时转 [[re-anti-analysis]]
|
||||
- [[re-ebpf]]:BPF 观测/跟踪取证还原——strace 覆盖不到的 skb/内核路径由 BPF 观测互补
|
||||
|
||||
## 常见坑与陷阱
|
||||
|
||||
- **不加 -f 漏子进程**:目标 fork 后父进程退出/exec,未跟踪的子进程行为全部丢失——`-f` 是标配
|
||||
- **输出巨大**:不过滤时大程序日志可达 GB 级拖垮磁盘——先 `-e trace=` 白名单,必要时 `-o` 写文件而非终端
|
||||
- **反调试样本检测 trace 环境**:`ptrace` 状态检测/`LD_PRELOAD` 痕迹暴露 strace/ltrace——与 [[re-anti-analysis]] 的反调试绕过组合使用
|
||||
- ltrace 默认只跟踪 PLT 层调用——`dlopen` 后加载的库函数要加 `-l` 显式指定
|
||||
- 命令族速查与操作序列见 [[commands]];工具特有坑与版本差异见 [[gotchas]]
|
||||
@@ -0,0 +1,114 @@
|
||||
# strace / ltrace / dtruss 命令速查与操作序列
|
||||
|
||||
分工:strace 看系统调用(内核边界),ltrace 看库函数调用(用户态边界),dtruss 是 macOS 的 strace 对应物(DTrace 实现)。选项以本机 `strace --help` / `ltrace --help` 为准(版本差异见 [[gotchas]])。
|
||||
|
||||
## 命令族速查
|
||||
|
||||
### strace —— 系统调用
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 全进程树跟踪 | `strace -f -o trace.log ./target` |
|
||||
| 按类别过滤 | `-e trace=file,network,process,signal,ipc,memory,desc,read,write`(可组合) |
|
||||
| 排除噪声 | `-e trace=!futex`(高频调用排除) |
|
||||
| 指定调用 | `-e trace=openat,execve,connect,sendto` |
|
||||
| 正则匹配调用名 | `-e trace=/open`(匹配含 open 的系统调用) |
|
||||
| attach 运行中进程 | `sudo strace -f -p <pid> -o attach.log` |
|
||||
| 汇总统计 | `-c`(退出打印 次数/耗时/错误 表) |
|
||||
| 时间戳 | `-tt` 微秒级;`-T` 每调用耗时 |
|
||||
| 字符串长度 | `-s 200`(默认 32) |
|
||||
| hex 输出 | `-x`(非 ASCII 转 hex);`-xx`(全部) |
|
||||
| fd 解析路径 | `-y`(路径);`-yy`(含 socket 细节) |
|
||||
| 按 pid 分文件 | `-o log.%p` |
|
||||
| 静默 | `-q`(抑制 attach/detach 消息) |
|
||||
|
||||
### ltrace —— 库调用
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 库调用跟踪 | `ltrace -f -o lib.log ./target` |
|
||||
| 指定函数 | `-e malloc+free`(`+` 追加、`!` 排除) |
|
||||
| 指定库 | `-l /path/libfoo.so`(dlopen 后加载的库) |
|
||||
| 库 + 系统调用 | `-S` |
|
||||
| 汇总 | `-c` |
|
||||
| 相对时间戳 | `-r` |
|
||||
| 指令指针 | `-i`(打印调用点 IP,对照反汇编) |
|
||||
| 调用栈 | `-w 5`(最多 5 帧 backtrace) |
|
||||
| attach | `ltrace -p <pid>` |
|
||||
|
||||
### dtruss(macOS,DTrace)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 基本跟踪 | `sudo dtruss -f ./target`(DTrace 输出走 stdout) |
|
||||
| 调用栈 | `-s`(打印 stack backtraces) |
|
||||
| 耗时统计 | `-e`(elapsed times,微秒) |
|
||||
| 过滤调用 | `-t <syscall>`(如 `-t write`) |
|
||||
| 汇总 | `-c`(syscall counts 次数统计) |
|
||||
|
||||
### 后处理管道
|
||||
|
||||
```sh
|
||||
strace -f -o trace.log ./target
|
||||
grep -E 'openat\(.*ENOENT' trace.log # "找不到文件"类线索(配置路径/缺失依赖)
|
||||
grep -E 'connect\(' trace.log # 网络回连点
|
||||
grep -c 'ptrace' trace.log # 反调试痕迹排查
|
||||
awk '/read\(|write\(/' trace.log # 数据搬运片段
|
||||
```
|
||||
|
||||
## 常用操作序列
|
||||
|
||||
### 1. 定位持久化/文件行为
|
||||
|
||||
```
|
||||
strace -f -e trace=file,process -o fs.log ./target
|
||||
→ grep openat/creat/rename/unlink + O_WRONLY/O_CREAT → 写盘路径清单
|
||||
→ grep execve → 拉起的进程链
|
||||
→ 结果对照 [[re-behavior]] 的持久化位置清单
|
||||
```
|
||||
|
||||
### 2. 网络回连与协议参数
|
||||
|
||||
```
|
||||
strace -f -e trace=network,read,write -o net.log ./target
|
||||
→ grep -E 'socket|connect|sendto|recvfrom' → 目标 IP:端口与数据片段
|
||||
→ -s 200 保证 payload 不截断;与 [[re-netcap]] 抓包对照
|
||||
```
|
||||
|
||||
### 3. 动态解析 API 跟踪(dlopen/dlsym 之后)
|
||||
|
||||
```
|
||||
ltrace -f -o lib.log ./target
|
||||
ltrace -f -l /path/libfoo.so ./target # 显式指定动态加载库
|
||||
→ 输出出现静态 IAT 里没有的函数 → 与 [[re-imports]] 静态结果合并成完整 API 面
|
||||
```
|
||||
|
||||
### 4. 反调试检测点定位
|
||||
|
||||
```
|
||||
strace -f -e trace=ptrace,process -o det.log ./target
|
||||
→ grep ptrace 观察样本自跟踪/检测行为
|
||||
→ 样本对 trace 环境常表现为时序差异或假路径——检测点确认后按 [[re-anti-analysis]] 绕过/静态 patch
|
||||
```
|
||||
|
||||
### 5. 热点统计(性能/路径偏好)
|
||||
|
||||
```
|
||||
strace -f -c -o /dev/null ./target # 系统调用热点
|
||||
ltrace -f -c ./target # 库调用热点
|
||||
→ 高频 futex/epoll_wait = 等待循环;高频 read/write = 数据搬运路径
|
||||
```
|
||||
|
||||
## 实现教训(内化)
|
||||
|
||||
- 输出即证据:`-o` 落盘 + 时间戳,终端只做预览;日志 sha256 入档([[re-triage]])
|
||||
- 字符串"看不到内容"第一嫌疑是 `-s` 默认 32 字节截断——先放大再重跑
|
||||
- 白名单过滤优于黑名单:先 `-e trace=network,file` 缩小,再 `!futex` 排噪
|
||||
- attach 追不到初始化:早期逻辑用启动模式重跑;attach 只看"当前时刻之后"
|
||||
- ltrace 依赖 PLT/动态符号表,静态链接程序基本无输出——先 `file` 确认动态链接,静态样本换 strace 或模拟执行
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 全部在沙箱内执行([[re-analyze/platform-tips]] 最高原则)
|
||||
- 反调试样本的 trace 结果可能被刻意污染(见 [[gotchas]] 与 [[re-anti-analysis]])
|
||||
- 证据链:日志路径 + sha256 + 时间戳 → [[re-analyze/analysis-contract]]
|
||||
@@ -0,0 +1,44 @@
|
||||
# strace / ltrace 工具特有坑与边界
|
||||
|
||||
## 进程树与附加
|
||||
|
||||
- **不加 -f 丢子进程**:fork/clone 后子进程行为全部丢失——`-f` 是标配;daemon 化(double-fork + setsid)目标尤其依赖
|
||||
- **attach 权限与限制**:`-p` 需要与目标同权限(ptrace 权限);跨 PID namespace(容器内 attach 宿主进程)直接拒绝;`/proc/sys/kernel/yama/ptrace_scope=1` 时非父进程 attach 失败(调 0 或保持同会话)
|
||||
- **attach 时机盲区**:attach 之前的调用不可见——注册/初始化逻辑用启动模式重跑,或先静态定位断点([[re-ida]] / [[re-binary-core]])
|
||||
- **多线程目标**:`-f` 隐含跟踪所有线程;输出按线程交错,`-e trace-fds=` 可精细到 fd
|
||||
|
||||
## 输出与过滤
|
||||
|
||||
- **输出体积失控**:不过滤时 GB 级日志拖垮磁盘——白名单 + `-o` 文件;只要结论时直接 `-c` 汇总
|
||||
- **字符串截断**:默认 32 字节——路径/URL/加密参数被截断,`-s 200` 起步
|
||||
- **`-e trace=` 类别名写错**:不存在的类别/调用名报 "invalid system call"(strace 会把整串当调用名解析)——类别用文档列出的 file/process/network/signal/ipc/memory/desc/read/write
|
||||
- **新内核新调用解码缺失**:内核 6.x+ 的新系统调用在旧 strace 上显示为原始数字/名字——升级 strace 或查内核头文件补语义
|
||||
|
||||
## 反调试对抗
|
||||
|
||||
- **ptrace 自检测冲突**:样本对自己或子进程执行 ptrace(PTRACE_TRACEME) 与调试器冲突——表现为 strace 挂起/无输出/样本直接退出;对策:静态定位检测点([[re-anti-analysis]]),或只跟踪关键路径
|
||||
- **注入机制痕迹**:strace/ltrace 的注入可被 /proc/self/maps 枚举——检测到后行为跳变是常态,别把污染后的输出当真
|
||||
- **时序破坏**:每调用开销放大,时序校验(自计时/rdtsc)目标会误判——时间敏感目标用 Intel PT(`perf record -e intel_pt`)或轻量 BPF([[re-ebpf]])替代
|
||||
|
||||
## ltrace 局限
|
||||
|
||||
- **只跟踪 PLT 层**:dlopen 后加载的库函数需要 `-l` 显式指定;静态链接程序无 PLT——ltrace 无输出,换 strace
|
||||
- **无调试符号时参数语义不明**:参数显示为寄存器/裸指针——配合 `-i`(指令指针)+ 反汇编对照确认语义
|
||||
- **维护滞后**:新 glibc 内部函数(如 malloc 变体)可能显示为地址而非名字——个别乱码不阻塞流程,语义靠 `-i` + 反汇编补
|
||||
|
||||
## macOS(dtruss)差异
|
||||
|
||||
- SIP 限制:系统签名进程(大部分 /usr/bin 与系统守护)dtruss 拒绝跟踪或权限失败——先拿普通用户态程序验证命令可用性
|
||||
- 需要 root:`sudo dtruss`;无 Xcode CLT 时无 DTrace 工具链
|
||||
|
||||
## 版本差异
|
||||
|
||||
- **strace 7.x(当前主线)**:seccomp-bpf 为 opt-in(5.3 起,`--seccomp-bpf` 显式启用,与 `-p` attach 不兼容);6.4 起指定 `--syscall-limit` 时自动关闭 seccomp-bpf 路径
|
||||
- **ltrace 0.8.x**:长期小步维护,选项稳定(-e/-l/-S/-c/-i/-w);与 0.7.x 差异主要在输出格式细节
|
||||
- **发行版打包差异**:RHEL 系偏旧(strace 5.x 常见,无 6.x 新选项)——新选项不存在时按本机 help 为准
|
||||
- **内核侧配置影响**:Yama ptrace_scope、seccomp 策略影响 attach 与跟踪能力——行为怪异先查内核配置
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 全部在沙箱内执行([[re-analyze/platform-tips]] 最高原则)
|
||||
- trace 日志作为证据:路径 + sha256 + 时间戳入档([[re-triage]]),结论写 [[re-analyze/analysis-contract]]
|
||||
Reference in New Issue
Block a user