yuzu-octopus/CTF-LLM
GitHub: yuzu-octopus/CTF-LLM
该项目提供了一个完整的微调流水线,利用 QLoRA 在免费 GPU 环境下训练出擅长解决 CTF 挑战和算法竞赛的轻量级 AI 模型。
Stars: 0 | Forks: 0
# CTF-LLM
在 Google Colab 免费版上,使用 [Unsloth](https://unsloth.ai) 和 QLoRA 微调开源 LLM(Gemma 4 E4B、Qwen 3.5 9B/4B),使其在网络安全 CTF 竞赛和竞赛编程中表现出色。
## 项目功能
本项目构建了一个完整的 pipeline,用于创建能够执行以下操作的专业 AI 模型:
- **解决 CTF 挑战**:二进制漏洞利用(pwn)、逆向工程、Web 漏洞利用、密码学
- **编写竞赛编程题解**:算法、数据结构、代码优化
- **分析安全漏洞**:识别并解释代码弱点
该 pipeline 从 GitHub 抓取真实的 CTF writeup 和编程题解,将它们与 HuggingFace 上精选的数据集相结合,并使用高效的 QLoRA(4-bit 量化 + LoRA 适配器)对模型进行微调。
## 快速开始
```
# 安装 uv (Python package manager)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 安装依赖
uv sync
# 运行完整 pipeline (build data + train)
./finetune.sh gemma4 --all
# 或者单独运行各步骤
./finetune.sh gemma4 --build-data # Just build datasets
./finetune.sh gemma4 --train # Just train (requires data)
./finetune.sh gemma4 --eval # Evaluate trained model
```
## 工作原理
### 1. 数据集收集 (`src/build_dataset.py`)
抓取包含 CTF writeup 和安全文档的 GitHub 仓库:
| 来源 | 包含内容 | 示例 |
|--------|------------------|----------|
| `Cajac/picoCTF-Writeups` | 250+ picoCTF 挑战题解 | Markdown + Python/C 漏洞利用代码 |
| `DarkCodeOrg/CryptoHack` | 密码学挑战题解 | Python 密码学漏洞利用 |
| `Adamkadaban/CTFs` | 多分类 CTF writeup | 涵盖 pwn、rev、web、crypto 的 376 MB 内容 |
| pwntools、angr、ROPgadget 文档 | 安全工具文档 | 用法示例和教程 |
此外,还会从 HuggingFace 下载结构化数据集:
| 数据集 | 大小 | 内容 |
|---------|------|---------|
| `nvidia/OpenCodeReasoning` | 73.5 万个样本 | 带有推理过程的竞赛编程题解 |
| `AlicanKiraz0/Cybersecurity-Dataset-Fenrir-v2.1` | 9.98 万个示例 | 网络安全问答 |
| `Jacqkues/ctf_webserver_v0.1` | 340 个样本 | Web CTF 挑战 |
### 1.5 合成 Rev/PWN 示例 (`src/synthetic_rev_pwn.py`)
包含 23 个手工编写的训练样本,涵盖了难度最高的 CTF 分类:
| 分类 | 示例 | 涵盖技术 |
|----------|----------|-------------------|
| **PWN** (13) | ret2win, ret2libc, format string, heap UAF, stack canary bypass, ROP chain, ret2dlresolve, fastbin attack, heap consolidation, shellcode injection, ASLR bypass, ret2csu, read→shellcode ROP | 漏洞利用代码前的思维链推理 |
| **REV** (10) | 二进制分析流程、XOR 密码、反调试、ELF sections、加壳检测、密码识别、keygen、Frida 追踪、LD_PRELOAD hooking、去混淆 | 逐步分析方法,而非仅仅给出答案 |
这些示例使用了思维链推理:模型学会在解决问题之前先进行分析,而不是直接跳到答案。
### 1.6 训练模式
有关完整的 Fast/Full 模式配置表(包括 LoRA 参数、数据集限制和预计训练时间),请参见 `AGENTS.md`。
### 2. 数据处理 (`src/process_data.py`)
将原始数据转换为微调所需的聊天格式:
```
Alpaca Format: ChatML Format:
{ {
"instruction": "...", "messages": [
"input": "...", {"role": "system", "content": "..."},
"output": "..." {"role": "user", "content": "..."},
} {"role": "assistant", "content": "..."}
]
}
```
系统提示会根据内容类别(CTF 还是竞赛编程)自动选择。
### 3. 模型训练 (`src/train.py`)
使用 Unsloth 优化的 QLoRA 训练:
- **4-bit 量化**:减少约 75% 的内存使用,可在免费的 T4 GPU 上进行训练
- **LoRA 适配器**:仅训练小型适配器层(约占参数的 1%)
- **聊天模板**:应用特定于模型的格式(Gemma 使用 `gemma-4`,Qwen 使用 `chatml`)
训练输出三个版本的模型:
- `lora/` - LoRA 适配器(体积小,用于继续训练)
- `gguf/` - GGUF 格式(用于 llama.cpp、Ollama、本地推理)
- `merged/` - 完整合并的模型(用于 HuggingFace、vLLM)
### 4. 模型评估 (`src/eval.py`)
在包含 200 道题目的 CTF benchmark(每个类别 50 道)上运行训练好的模型,并报告带有 Wilson 95% 置信区间的准确率:
```
# 单个 model
uv run src/eval.py --model gemma4 --adapter outputs/gemma4-ctf/lora
# 并排比较 models (使用 McNemar's test)
uv run src/eval.py --compare \
gemma4:outputs/gemma4-ctf/lora \
qwen35:outputs/qwen35-ctf/lora
# 按 category 或 difficulty 筛选
uv run src/eval.py --model gemma4 --adapter outputs/gemma4-ctf/lora --category pwn --difficulty easy
# 将结果保存为 JSON
uv run src/eval.py --model gemma4 --adapter outputs/gemma4-ctf/lora --output data/eval/results/
```
该 benchmark 涵盖 4 个类别(pwn、rev、crypto、web),分为 3 个难度级别,并支持对 flag 提取、多选题和代码生成任务进行自动评分。
**评估器局限性**(N=200 会产生 ±7% 的误差范围):
- `grade_code` 验证语法 + 参考关键字,而非功能正确性
- `grade_mcq` 匹配 `Answer: X` / `(X)` / 后备为最后一个字母
- `grade_flag` 使用正则表达式 `flag\{[^}]+\}`
- 结果仅供参考,并不具备决定性 — 扩展至 N=500 可获得 ±4% 的置信区间
### 5. Colab 集成 (`finetune.sh`)
使用 `colab` CLI 自动化整个工作流程:
1. 创建带有免费 T4 GPU 的 Colab 会话
2. 安装依赖项
3. 上传数据和脚本
4. 运行训练
5. 下载训练好的模型
6. 清理会话
## 项目结构
```
finetuning/
├── finetune.sh # Main entry point - orchestrates everything
├── config.yaml # Central configuration for models and training
├── pyproject.toml # uv project config and dependencies
├── requirements.txt # Local Python deps
├── requirements-colab.txt # Colab-only install set (ordered)
├── AGENTS.md # Instructions for AI agents
├── README.md # This file
├── TRAINING.md # Step-by-step training guide
├── .mimocode/commands/ # Slash-commands for mimocode
│ └── ft-diag.md # /ft-diag — Colab failure mode diagnostic
│
├── src/ # Python scripts
│ ├── train.py # Unified training script (reads configs/*.yaml)
│ ├── build_dataset.py # Scrapes GitHub repos for writeups
│ ├── download_datasets.py # Downloads HuggingFace datasets
│ ├── process_data.py # Converts data to chat format
│ └── eval.py # CTF model evaluator (200-question benchmark)
│
├── configs/ # Model-specific configurations (3 total)
│ ├── gemma4.yaml # Gemma 4 E4B settings
│ ├── gemma4-12b.yaml # Gemma 4 12B settings
│ ├── qwen35.yaml # Qwen 3.5 9B settings
│ └── qwen35-4b.yaml # Qwen 3.5 4B settings
│
├── notebooks/
│ └── qwen4b_self_contained.ipynb # ONLY notebook (full pipeline)
│
├── data/
│ ├── eval/
│ │ └── ctf_bench.jsonl # 50 curated CTF challenges (evaluation)
│ ├── raw/ # HuggingFace downloads (gitignored)
│ ├── processed/ # Converted to chat format (gitignored)
│ └── merged/ # Final merged training file (gitignored)
```
## 配置
### 主配置 (`config.yaml`)
所有设置的集中管理位置:
```
default_model: gemma4
models:
gemma4:
name: unsloth/gemma-4-E4B-it
r: 32 # LoRA rank
lora_alpha: 32 # LoRA scaling
max_seq_length: 4096 # Max token length (limited by T4 VRAM)
batch_size: 1 # Batch size (limited by T4 VRAM)
training:
num_train_epochs: 3
learning_rate: 2e-4
gradient_accumulation_steps: 4
```
### 模型配置 (`configs/*.yaml`)
覆盖主配置的单个模型配置:
```
# configs/gemma4.yaml
model:
name: unsloth/gemma-4-E4B-it
target_modules: all-linear # Apply LoRA to all linear layers
r: 32
lora_alpha: 32
```
## 添加新模型
1. 创建包含模型设置的 `configs/newmodel.yaml`
2. 将模型添加到 `config.yaml` 中的 `models:` 下
3. 运行:`./finetune.sh newmodel --all`
## 硬件要求
| 组件 | 要求 |
|-----------|-------------|
| GPU | NVIDIA T4 (16GB) - 在 Colab 上免费提供 |
| VRAM | 使用 QLoRA 时占用约 12GB |
| 训练时间(Fast 模式) | 约 500 个样本需 ~30 分钟 |
| 训练时间(Full 模式) | 约 2500+ 个样本需 ~50-70 分钟 |
| 存储空间 | 数据约 2GB,模型约 4GB |
## 导出格式
| 格式 | 使用场景 | 命令 |
|--------|----------|---------|
| GGUF | llama.cpp、Ollama、本地推理 | `model.save_pretrained_gguf()` |
| SafeTensors | HuggingFace、vLLM、推理 API | `model.save_pretrained_merged()` |
| LoRA | 继续训练、微调 | `model.save_pretrained()` |
## 故障排除
**内存不足 (OOM)**
- 减少配置中的 `max_seq_length`(尝试 2048)
- 确保 `batch_size: 1`
- 使用 `use_gradient_checkpointing: unsloth`
**训练缓慢**
- 确保您使用的是 GPU 运行时
- 检查 `fp16`/`bf16` 设置是否与您的 GPU 匹配
**数据问题**
- 验证格式:`head -1 data/merged/train.jsonl | python -m json.tool`
- 检查空输出:`grep -c '"output": ""' data/merged/train.jsonl`
## 致谢
- [Unsloth](https://unsloth.ai) - QLoRA 训练框架
- [CTFtime](https://ctftime.org) - CTF writeup 来源
- [picoCTF](https://picoctf.org) - CTF 挑战平台
- [CryptoHack](https://cryptohack.org) - 密码学挑战平台
标签:DLL 劫持, 云资产清单, 人工智能, 凭据扫描, 大语言模型, 微调, 搜索语句(dork), 用户模式Hook绕过, 逆向工具, 逆向工程