---
name: patch-diff-exploit
description: "Locate vulnerability fixes in vendor patches, diff binaries across versions, and build N-day PoCs. Attack-side complement to binary-diff for authorized research."
risk: offensive
source: "https://github.com/zhaoxuya520/reverse-skill"
source_repo: "zhaoxuya520/reverse-skill"
source_type: community
date_added: "2026-08-25"
license: "MIT"
license_source: "https://github.com/zhaoxuya520/reverse-skill/blob/main/LICENSE"
---
> **⚠️ AUTHORIZED USE ONLY**
> This skill is for educational purposes or authorized security assessments only.
> You must have explicit, written permission from the system owner before using this tool.
> Misuse of this tool is illegal and strictly prohibited.

> **Mandatory confirmation gate**
> Before running any command that probes, exploits, changes, persists on, extracts data from, or attempts credential access against a target:
> 1. Ask the user to state the exact target URL, IP, account, or resource.
> 2. Ask the user to confirm written authorization and the permitted scope.
> 3. Show the exact command(s) and explain their expected effect.
> 4. Wait for explicit confirmation in the current conversation.
>
> Without that confirmation, remain read-only and provide defensive guidance only. Prefer a sandbox, disposable VM, or controlled lab.

## When to Use

- Turning a vendor security advisory into a concrete vulnerable-function location.
- Building a proof-of-concept for a patched vulnerability in authorized research.

## 适用范围

当任务属于以下场景时使用本 skill：

1. **已知 CVE 但无公开 PoC** — 厂商公告写了"修复了 XX 组件的越界写"但没放 PoC，需要从补丁反推
2. **SRC / 红队打 N-day** — 目标资产未及时更新，需要把刚发布的补丁差成可用的 1-day 利用
3. **Patch Tuesday 跟进** — 每月第二个周二微软放补丁，需要快速锁定高价值漏洞（Kernel / Win32k / AFD / CLFS）
4. **Linux LTS 补丁分析** — 主线 fix 已合并，但旁支或某发行版 backport 不全，找未修补面
5. **驱动 / 服务的安全补丁还原** — 显卡驱动、AV 引擎、虚拟化组件等闭源软件的补丁分析

### 与其他 skill 的分工

| 场景 | 用什么 |
|------|--------|
| 有旧版符号，迁移到新版本帮助分析 | `binary-diff/` |
| **从补丁找漏洞、写 PoC 打补丁前版本** | **本 skill** |
| 写出完整利用链（堆喷、ROP、提权） | `pwn-chain/` |
| 把 1-day 武器化部署到目标网络 | `pentest-tools/network-attack-defense/` |
| 从零逆向一个二进制 | `ida-reverse/` / `radare2/` |

差别的关键：`binary-diff` 的目标是**让新版可分析**（把旧符号搬过来），本 skill 的目标是**找出补丁修了什么 bug 然后打补丁前的版本**。前者服务防御侧 / 研究侧分析，后者服务攻击侧武器化。

## 核心原理

```text
patched 二进制 (after)         unpatched 二进制 (before)
        ↓                                  ↓
    导入 IDA/Ghidra              导入 IDA/Ghidra
        ↓                                  ↓
        └──────── BinDiff / ghidriff ──────┘
                        ↓
        函数级 diff（matched / unmatched / changed）
                        ↓
        聚焦 match score 中等的函数（0.5 - 0.9）
                        ↓
        看新增了什么：边界检查 / 锁 / 字段清零 / 整数溢出检查
                        ↓
        反推 bug class：OOB / Race / Info Leak / UAF / Integer Overflow
                        ↓
        在 unpatched 版本上写 PoC 触发
                        ↓
        验证：unpatched 崩 / patched 不崩 → 漏洞确认
```

补丁修复模式 → 漏洞类型反查：

| 新增内容 | 大概率的 bug class |
|---------|------------------|
| `if (a + b < a)` / `__builtin_add_overflow` | 整数溢出 |
| `KeAcquireSpinLock` / `mutex_lock` | 竞争条件 (TOCTOU / double-free) |
| `if (idx >= MAX)` / `if (len > buf_size)` | 越界读 / 越界写 |
| `RtlZeroMemory` / `memset(struct, 0, ...)` | 未初始化内存信息泄漏 |
| `InterlockedDecrement` + refcount 检查 | UAF / 引用计数错误 |
| `ProbeForRead` / `ProbeForWrite` | 用户态指针未校验 |
| `SeAccessCheck` / capability 校验 | 权限校验缺失 |
| 删除 / 收紧 `IOCTL` code | 暴露面收敛（看老接口怎么打） |

## 工作流

### 5 步完整流程

```text
Step 1: 拿 before / after 二进制
  - Windows: Microsoft Update Catalog 下 MSU/MSP，用 expand.exe / dism 解包
  - Linux: 从发行版 USN/RHSA 拉 .deb/.rpm，用 dpkg-deb / rpm2cpio 解包
  - 第三方软件: 官网取 N-1 和 N 版本安装包

Step 2: 对齐符号
  - 有 PDB 直接吃，没 PDB 时用 binary-diff skill 把 N-1 版本的符号搬到 N 版本
  - Linux 内核取对应版本的 vmlinux + System.map / debuginfo

Step 3: 二进制 diff
  - BinDiff: 直接给两个 IDB，看函数级匹配结果
  - ghidriff: pip 一键安装，CLI 输出 markdown 报告
  - Diaphora: IDA 内插件，老牌但需要 IDA Pro

Step 4: 定位变更
  - 过滤 match score 0.5-0.95 的函数（完全相同的不看，完全不同的多半是新加 / 重命名）
  - 重点看：新增的 if / 新增的循环边界 / 删除的代码块（删了什么也是线索）
  - 用 LLM 看 before/after 伪代码反推 bug class（见 references/root-cause-and-poc.md）

Step 5: 写 PoC
  - 整数溢出：构造边界值（INT_MAX-1、0xFFFFFFFF）
  - 竞争：多线程 hammer，open/close + ioctl 高频并发
  - UAF：spray → free → reuse pattern
  - OOB：精确控制 len / index 越过边界
  - 验证 patched 版本不再崩，unpatched 版本稳定崩 → bug 复现成功
```

### 工具调用顺序

```text
下补丁 → 解包 → 加载到 IDA/Ghidra → BinDiff/ghidriff → 看 unmatched/low-match 函数
       → LLM 反推 bug class → 写 PoC → 在 unpatched 跑 → 崩 → 收工
```

## 典型场景示例

### 场景 1：Windows Patch Tuesday — Kernel CVE 复现

```text
背景：2025 年 11 月 Patch Tuesday，MSRC 公告 CVE-2025-62215
      Windows Kernel race condition 导致 double free，CVSS 7.0，本地提权
      微软只放了补丁，没放细节，没有公开 PoC

目标：复现 PoC，验证未打补丁的 Windows 11 22H2 / 23H2 可提权

步骤：
1. Microsoft Update Catalog 搜 "2025-11" + KB 号，下两个版本：
   - 22H2 build 22621.xxxx (unpatched)
   - 22H2 build 22621.yyyy (patched 后)
   命令:
     expand.exe Windows-KB5052000-x64.msu -F:* C:\out\patched\
     expand.exe C:\out\patched\Windows-KB5052000-x64.cab -F:* C:\out\patched\
   提取 ntoskrnl.exe / win32k.sys / win32kfull.sys / afd.sys

2. 两个版本都吃 PDB (微软符号服务器):
     symchk /v /r ntoskrnl.exe /s SRV*C:\sym*https://msdl.microsoft.com/download/symbols

3. 跑 BinDiff:
     bindiff old.BinExport new.BinExport
   或 ghidriff:
     ghidriff ntoskrnl_old.exe ntoskrnl_new.exe -o diff_out/

4. 看报告，过滤 similarity 0.6-0.95 的函数。
   假设定位到 NtXxxIoctl 类函数新增了一段:
     KeAcquireSpinLockRaiseToDpc(&obj->Lock);
     if (obj->RefCount == 0) { ... goto cleanup; }
   → 新增了锁 + 引用计数检查 → race + double free，符合公告描述

5. 写 PoC：用户态多线程同时调 NtClose + 触发同一对象的 IOCTL，
   制造 close 释放与 IOCTL 还在用之间的竞争窗口
   崩在 ntoskrnl 的 ObfDereferenceObject 后续 free 路径上

6. 验证：
   - unpatched 22621.xxxx 上跑 PoC，~30 秒内 BSOD (BAD_POOL_HEADER 或 DOUBLE_FREE)
   - patched 22621.yyyy 上跑同 PoC，无任何异常
   → 复现成功
```

### 场景 2：Linux 内核 LTS 分支补丁找未修的旁支

```text
背景：主线 6.x 已修某 net subsystem 的 OOB 写
      Ubuntu 22.04 (5.15 LTS) 的 USN 已发布更新
      但某些 OEM kernel / Azure kernel 的 backport 节奏更慢
      想确认未更新的旁支是否仍可打

目标：取 patched/unpatched 内核，差出 fix commit 对应的二进制变更，
      在 unpatched 旁支上重写 PoC

步骤：
1. 拉 patched 与 unpatched 包:
     apt download linux-image-5.15.0-101-generic   # patched
     apt download linux-image-5.15.0-100-generic   # unpatched
     dpkg-deb -x linux-image-5.15.0-101-generic_*.deb ./patched/
     dpkg-deb -x linux-image-5.15.0-100-generic_*.deb ./unpatched/
   提取 boot/vmlinuz → 用 extract-vmlinux 还原 ELF

2. 同步取 dbgsym:
     apt download linux-image-unsigned-5.15.0-101-generic-dbgsym

3. 用 ghidriff (Linux 友好):
     ghidriff vmlinux_5.15.0-100 vmlinux_5.15.0-101 \
              -o /tmp/kdiff/ --max-section-funcs-analyze 8000

4. 报告里搜 net/ipv4/ net/ipv6/ net/sched/ 等子系统的 changed 函数
   找到补丁前 skb_copy_bits 调用前缺少 skb->len 上限校验
   → OOB read，可能配合可触发的 sysctl 升级到 OOB write

5. 在 unpatched 旁支（例如 Azure 5.15.0-1080 backport 落后的版本）
   交叉验证：同一函数 fix 是否已 backport
   如果没 backport → 旁支仍可打 → 写 PoC 重放

6. 写 PoC：syzkaller harness 改造 / 直接 C PoC 触发对应 syscall
   验证旁支 panic / KASAN 报 OOB
```

## 注意事项

- **法律边界** — 武器化 N-day 必须在授权范围内（SRC / Bug Bounty / 自有靶机 / CTF）。对生产环境直接打 1-day 等同入侵
- **补丁可能只是"减小爆炸半径"** — 看到 patch 不一定就是完整修复，有可能只是补一个利用路径，原始 bug 仍可从别的路径触发（一鱼多吃）
- **变量名/类型不要被欺骗** — Windows 补丁经常顺手做 cleanup / rename，看似变更很大但实际无关。要看控制流和数据流，不要看 token 级 diff
- **微软的补丁可能加了 mitigation 而不是 fix** — 看到 `_guard_xfg_dispatch_icall_fptr` 这种 CFG 强化不要当成 fix，那是 mitigation
- **匿名化** — writeup / PoC 公开时脱敏目标机器名、内网 IP、用户名（写 `{target_ip}` `{username}` 占位）
- **patched 版本上要能跑通无害化测试** — 别只在 unpatched 上跑，否则可能是环境因素导致的崩溃，不是漏洞
- **二进制 diff 不万能** — 编译器升级 / 优化等级变化也会让函数 layout 大变，先用 N 版本和 N-1 版本（同一编译器）对比，不要跨大版本

---

## 按需自举（On-Demand Bootstrap）

### 工具依赖

| 工具 | 用途 | 可自动安装 |
|------|------|-----------|
| BinDiff (Google, 5.x+) | 函数级二进制 diff，IDA/Ghidra 插件 | ✓ (有官方 .deb / .msi) |
| Diaphora | IDA 老牌 diff 插件，需要 IDA Pro | ✓ (git clone) |
| ghidriff | Ghidra headless CLI diff，输出 markdown | ✓ (pip install ghidriff) |
| DeepDiff (商业) | 新一代 diff 工具，准确度更高 | ✗ (商业授权) |
| Ghidra | ghidriff 的运行底座 | ✓ |
| IDA Pro | BinDiff / Diaphora 的运行底座 | ✗ (商业) |
| Microsoft Update Catalog | 下 MSU/MSP 补丁包 | 在线服务 |
| wsuspect-proxy | 透明拦截 Windows Update 流量取补丁 | ✓ (git clone) |
| expand.exe / dism | 解 MSU / cab | ✓ (Windows 自带) |
| rpm2cpio / dpkg-deb | 解 Linux 发行版包 | ✓ |
| symchk | 从微软符号服务器拉 PDB | ✓ (Windows SDK) |

### 自举命令

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File "&lt;SKILL_ROOT&gt;\skills\scripts\bootstrap-reverse.ps1" -Capability @('bindiff','ghidriff','ghidra','wsuspect-proxy') -StartServices
```

详细工具对比与命令见 `references/diff-tools-comparison.md`。
详细 Patch Tuesday 工作流见 `references/patch-tuesday-workflow.md`。
根因反推与 PoC 模板见 `references/root-cause-and-poc.md`。

---

## 路由上下文

**上游入口**: `skills/SKILL.md`（总控）、`routing.md`

**上游 skill**:
- `reverse-engineering/` — 在做 diff 之前可能要先理解目标二进制的整体结构
- `binary-diff/` — 如果补丁后版本无符号、补丁前有符号，先用 binary-diff 搬符号过来

**下游 skill**:
- `pwn-chain/` — 反推出 bug class 后，需要写完整利用（堆喷、ROP、SMEP/SMAP 绕过、提权 payload）
- `pentest-tools/network-attack-defense/` — 把 N-day 武器化部署到目标网络（包装成可投递载荷、对接 C2）
- `attack-chain/` — 把这一个 N-day 串到完整攻击链里（初始访问 → 提权 → 横向）

**触发条件**: 任务包含"N-day"、"补丁"、"CVE 复现"、"找补丁修了什么"、"打未更新主机" 等意图

## 任务完成自检（声称完成前 MUST 通过）

- [ ] 我是否执行了工作流中的每一步（而不是只阅读）？
- [ ] 我是否基于 `tool-index` 使用了真实工具路径？
- [ ] 我是否产出了可复现证据（命令/脚本/截图/报告）？
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项？

## Limitations

- PoC development only for vulnerabilities you are authorized to research.
- Patch diffing fails when vendors rebuild extensively between releases.

> Adapted from [zhaoxuya520/reverse-skill](https://github.com/zhaoxuya520/reverse-skill) (MIT).
