CTF-All-In-One:按攻击面组织的CTF知识库实战指南
简介面向CTF入门与进阶选手的《ctf-all-in-one.pdf》是一份系统覆盖夺旗赛知识体系的综合性学习文档适合从零了解CTF赛制、常见题型与工具链并在Pwn、Web、Crypto、Reverse、Misc、Mobile各方向搭建完整认知框架。文档分为基础知识篇、工具篇、分类专题篇、技巧篇、高级篇、题解篇和实战篇基础知识含HTML/HTTP/JavaScript、Linux/Web安全、x86与ARM汇编、ELF/PE文件格式、glibc malloc及Android安全工具篇梳理gdb/peda、IDA Pro、pwntools、ollydbg、JEB、metasploit、Burp Suite等常用工具专题篇重点讲解格式化字符串、整数溢出、栈溢出、ROP、Linux堆利用与内核漏洞利用高级篇还涉及AFL/libFuzzer模糊测试、angr/Triton/KLEE符号执行、LLVM、Z3及Unicorn模拟器等进阶技术。后附多个历年CTF赛事真题题解及CVE真实漏洞复现案例便于对照实战全流程查漏补缺。资源包共1个PDF文件大小6.69MB目录层级清晰可作常备离线手册已有593人学习下载适合希望系统备赛、提升二进制利用与漏洞分析能力的选手。1. CTF-All-In-One 是什么一份“按攻击面组织”的 CTF 对抗知识库第一次参加 CTF 比赛的人通常不是被题目难倒而是被资料淹倒。CTF-All-In-One 恰恰解决的是“资料太多、体系太少”的问题它把散落在各个论坛、博客里的 writeup 和知识点重新按攻击面组织成一份持续更新的 Markdown 文档集合。它不是一套视频课程也不是几百篇题解的物理叠加而是一棵按 Web、Reverse、Pwn、Crypto、Misc 等方向展开的知识树。每个方向下都有从零开始的基础讲解、代表性例题和环境搭建说明。适合两类人刚入门但不知道先学什么的新手以及打了半年比赛但总是在某几个方向卡住、需要系统筛查盲区的老手。你对它的定位越清楚越能从中榨出价值。2. 拆目录就能看懂 CTF 学习栈先从 Web 入手还是直接 Pwn2.1 All-In-One 的完整知识地图五大方向加一条辅助线展开 All-In-One 的目录你会看到一套相当完整的 CTF 知识分类。下面这张表是我基于常见版本整理的典型结构实际维护版本可能在小节上有增删但主干不会变方向典型章节内容上手门槛我的入门时长建议WebHTTP 协议、SQL 注入、XSS、文件上传、SSRF、反序列化会发 HTTP 请求懂一点前端12 周Reverse汇编基础、静态分析、动态调试、反混淆能读懂 x86/ARM 汇编了解内存布局23 周Pwn栈溢出、堆利用、格式化字符串、ROP熟悉进程内存布局和系统调用34 周Crypto古典密码、分组模式、RSA、椭圆曲线、哈希长度扩展会写 Python懂基础数论12 周Misc文件头分析、隐写、编码、流量分析、社工几乎零门槛工具驱动35 天这张表不是让你按顺序刷完的它更多是一张作战地图。我第一次用这份资料时就是从 Misc 入手的。原因很简单Misc 对前置知识要求最低几道题做下来能快速建立信心同时能熟悉比赛平台的交互方式。Crypto 紧随其后因为现代 CTF 的 Crypto 题并不要求你证明数学定理只要会调 PyCrypto 和 SageMath 的接口就能完成大部分利用步骤。Web 是另一个适合早期切入的方向它的正反馈特别直接你往输入框里塞一个单引号页面报错了你就知道“这里可能有注入点”这种即时反馈是学习动力最好的来源。而 Pwn 和 Reverse 放后面是合理的因为二进制方向要求你先建立“程序在内存里长什么样”的直觉直接上手会一头雾水。这份文档的目录结构实际上已经把这条优先级节奏帮你排好了。2.2 三种阅读方式按需查、按题学、按路线过很多人拿到这套文档后犯的第一个错误是从第一页开始看。这份材料的定位是知识库不是教材所以最有效的使用方式是“按需取用”而不是“线性通读”。我一般会把它拆成三种场景来用。第一种是“按题查”。比赛里遇到一道不会的题先看题目 tag 属于哪个方向然后回到文档对应章节找同类技术点的讲解。比如你不会 RSA 共模攻击就直接翻 Crypto 非对称加密那一节只看共模攻击那几段而不是把整个 RSA 章节读完。这种阅读方式效率最高因为它把文档当成了字典。第二种是“按题学”。做完一道题后复盘把题目考点对应到文档章节再顺着那条线往前读一节、往后读一节把相关知识补齐。第三种才是按路线过适合完全没打过比赛的人。这时候只读每个方向的第一节和最后一节第一节告诉你这个方向在干什么最后一节告诉你学会后的样子是什么中间细节等遇到题再回来填。三种方式交替使用文档才不会变成你收藏夹里的“吃灰资源”。我见过太多人把整个仓库下载下来然后打开第一章看了两页就再也没碰过——问题不在资料质量在于阅读方式不对。知识库类资料的阅读逻辑应该是“导航式”的永远把目录当坐标而不是把页码当进度条。2.3 例题和环境的关系题解不是答案是可复现实验All-In-One 里的例题和普通论坛里的 writeup 有一个明显差异它的每道题通常会附带环境信息比如运行的服务端组件版本、题目打包方式、常见启动参数。这一点很容易被新手忽略但对老手来说恰恰是精华。我在做实战复盘时有一个很深的体会——直接抄题解里的命令是效率最低的利用方式。题解是在某个特定环境下跑通的它依赖几件事服务端 libc 版本、二进制文件编译时的保护选项、题目源码里的过滤逻辑。All-In-One 里那些例题之所以能反复看就是因为它把这些“环境假设”写在了前面而不是只丢一个 flag 截图。所以正确读法是把它当成一份实验指导环境怎么搭、输入是什么、输出代表什么、三个要素都齐了才算“会做这道题”。读例题时我建议你额外关注题解里“为什么这里要这样写”的部分而不是跳过去只看最终 payload。比如栈溢出例题里偏移量为什么是这个数返回地址为什么要覆盖到那个位置这些推理过程才是能从文档里真正带走的东西。环境信息是黑匣子调参的钥匙丢了钥匙payload 就是玄学。3. 本地部署与检索把这份 Markdown 文档变成随时可查的武器库3.1 克隆仓库并用编辑器直读零依赖的第一步All-In-One 本身就是一份 Markdown 文档仓库所以最低成本的本地使用方式就是克隆下来用编辑器直接打开。这一步完全不依赖任何构建工具也让文档在你本地永远可用。git clone --depth 1 仓库地址 cd CTF-All-In-One--depth 1表示只拉取最新一次提交可以显著减少下载体积。如果你不打算参与文档更新提交这个参数能省掉全部历史版本占用本地只需要保留当前快照。克隆完成后用 VS Code 或者 Typora 直接打开目录里的.md文件就能阅读。这一步的逻辑是先让文档在你手里“活起来”再谈其他优化。有些人在克隆之后还会加一句git pull用于后续同步但我更建议按需同步——比赛季前拉一次平时不折腾避免频繁更新打乱自己的笔记标注。3.2 用 Docsify 五分钟搭建可点击目录的本地站点直接读 Markdown 文件能看但没有目录书签和搜索功能在文档体量变大后体验下降明显。常见的做法是用 Docsify 起一个本地静态站它能把当前目录里的 Markdown 文件渲染成带侧边栏的文档站点全程只需要两条命令。npm i -g docsify-cli docsify serve . -p 4000第一条命令把 docsify 脚手架装到全局依赖 Node.js 环境建议版本在 12 以上。第二条命令里.是指定当前目录为文档根目录-p 4000是端口参数意思是把站点服务在 4000 端口避免占用默认的 8080 端口。启动后浏览器访问http://localhost:4000就能看到渲染后的文档站。如果你的仓库本身用的是 GitBook 结构里面会有 SUMMARY.md 和 README.mddocsify 默认也能识别 README.md 作为首页。把你最关注的几个文件置顶到侧边栏每道题的记录从“打开文件夹”变成“点击左侧目录”阅读效率会高一个量级。Docsify 的配置只需要在index.html里改一个loadSidebar参数具体数值按项目文档改即可新手不用强求。3.3 用 rg 实现秒级全库检索三个必记参数文档规模一大最需要的功能是全文检索。我一般用 ripgrep 而不是直接在编辑器里搜因为它在整个仓库里扫一遍通常不到一秒而且支持正则表达式。下面这条命令是我最常用的rg -n ret2libc|栈迁移 . -g *.md --context 3-n会显示匹配行所在行号方便你直接定位到对应文件--context 3表示把匹配行前后各 3 行也带出来省去反复翻页-g *.md限定只搜 Markdown 文件避免把 node_modules 里的依赖文件也扫进来否则检索结果会被噪声淹没。这套命令的价值在于它能帮你在比赛现场实现“秒级取用”。比如你遇到一道不会的密码学题题目只写了“common modulus”你顺手敲一句rg -n common modulus . -g *.md文档里所有涉及共模攻击的段落会瞬间列出来。把这三条参数记熟全库检索就彻底脱离鼠标操作了。4. 用 All-In-One 反哺刷题题目、章节、模板的三层映射4.1 先定方向再查章节一张题型映射表文档只有在被“用”的时候才有价值而最常见的用法是拿着比赛题目回来找对应章节。我打比赛时有自己固定的映射表按题目 tag 直接定位到 All-In-One 里对应的章节位置比赛题型 tag对应 All-In-One 章节建议检索关键词Web / SQL 注入Web 注入篇sql injection、万能密码、堆叠注入Web / 文件上传Web 漏洞篇文件头校验、解析漏洞、.htaccessPwn / 栈溢出Pwn 溢出篇ret2libc、栈迁移、padding 长度Pwn / 格式化字符串Pwn 格式化篇%n 写入、动态偏移、got 表覆写Crypto / RSACrypto 非对称篇common modulus、低指数、WienerMisc / 图片隐写Misc 隐写篇LSB、文件分离、像素通道统计有了这张表你拿到一道题后的动作就从“愣住”变成了“查字典”。高手的差距往往不只是在知识点储备上更在于把题目翻译成知识库检索词的速度。4.2 把章节内容压缩成自己的解题模板只看文档不做记录效果会大打折扣。我的习惯是每次复盘时把 All-In-One 里对应章节压缩成一张“解题模板”模板里只保存三类信息判断依据、利用骨架、排错点。下面是一个我在做完栈溢出题目后沉淀的模板样式## 题目类型Pwn / 栈溢出 判断依据main 函数里有 gets()无 canaryNX 开启 利用骨架 checksec --file ./pwn objdump -d ./pwn | grep pop python3 exploit.py 排错点 1. offset 不是标准 64 位长度用 cyclic 实测 2. 返回地址指向 libc 里的 pop rdi; ret要先查 gadget模板里的每一步都不是从原文档抄来的而是经过自己复现后筛选出的最短路。这个步骤的意义在于强迫大脑对信息做一次压缩写下来的过程就是理解的过程。模板积少成多的过程中你会自然发现文档里哪些话是核心、哪些话只是过渡。4.3 赛前两小时的只读清单怎么列、读什么比赛前两小时通常不适合学新东西适合“热手”和“回顾”。我的习惯是赛前双休日的最后一天傍晚把文档里几个高频章节固定过一遍Web 的文件上传绕过、Pwn 的格式化字符串、Crypto 的常见编码与加密模式、Misc 的隐写工具链。具体做法是打开文档只看每节的“例题描述”和“利用思路”两处每个章节控制在 15 分钟内过完。这样做的目的是在进赛场前把“思维开关”全部打到对应位置。开赛拿到题目后第一反应不是“这是什么”而是“这像文档里哪个章节”检索链路直接从大脑里启动。赛前两小时读文档的价值不在记忆新增知识而在唤醒已有的调用路径。5. 避坑让 CTF-All-In-One 失效的 5 个常见动作5.1 把它当教材从头读到尾两周还停在环境准备现象有人下载完文档后从第一页开始逐页阅读两周过去了还停留在“环境准备”那一节连一道完整的题都没做过。原因这份材料的结构是字典和地图不是线性教材。每一章之间虽有递进关系但不代表每一章都需要“读完才能进入下一章”。环境准备那节尤其长因为它要照顾所有主流操作系统和工具链你只需要挑自己系统对应的那一段就够了。解决把文档拆开用。第一遍只看目录建立心智地图第二遍从 Misc 或 Web 这种低门槛方向切入边做例题边查文档第三遍才在赛后按知识点回头补盲区。从头读到尾是时间利用率最低的用法。5.2 盲抄例题里的偏移量换个靶场就打不穿现象从文档的栈溢出例题里复制了完整的 offset 和 payload拿到比赛题目里一跑就段错误完全打不穿。原因例题里的偏移量、返回地址、libc 地址都依赖具体的二进制文件和服务端环境。文档写的是“这道题在这个环境下的利用”而不是“所有同类题都能用这段命令通杀”。换一道题缓冲区大小变了保护选项变了栈布局就完全不一样。解决把题解当思路不要当脚本。利用前先跑一遍 checksec看二进制文件开启了哪些保护然后用 cyclic 自己实测偏移长度。文档里“环境搭建”章节能帮你复现例题环境先在那个容器里把例题跑通你才算真正理解那段脚本在做什么。5.3 本地构建失败就放弃忽略了文档本身的可用性现象有人按仓库里的构建教程操作遇到 npm 依赖版本冲突或者构建报错直接得出结论“这个项目已经过时了、不能用”。原因文档的价值在 Markdown 内容本体而不在使用什么脚手架。旧仓库里的构建脚本可能会因为依赖老版本而失败但这不代表文档内容失效了。解决绕开脚手架直接读源文件或者换用 docsify 这类轻量渲染工具把文档目录跑起来。记住一个原则当工具链出问题时优先换工具而不是怀疑知识本身。Markdown 文件本身就是最稳定的载体任何能渲染 Markdown 的工具都能把它变成可读文档。5.4 只看题解不敲命令看完觉得自己会了现象花了三个小时把所有例题的 writeup 都“看懂了”关上电脑发现自己一条命令都敲不出来比赛时完全想不起利用链是怎么走的。原因看题解产生的是熟悉感不是操作能力。文档标记的是“我记得这段解释过”而不是“我能从头把这个利用写出来”。做题靠的是肌肉记忆这个记忆只能通过亲自敲命令、看报错、改参数来建立。解决给自己立一个规矩——每读完一个章节必须亲手复现其中至少一道例题并且记录下最终是否拿到 shell 或 flag。报错信息是很好的学习素材如果你把文档里的例题在自己环境里复现出同样的报错再对照文档解决掉这一节的吸收率会大幅上升。5.5 想一条线学完再做题结果卡在汇编直接弃坑现象按自己的学习计划从二进制基础开始啃因为没写过汇编在 Pwn 章节遇到不认识的指令后觉得方向太难整个 CTF 就此放弃。原因把一个方向的“学习路径”误解成了“前置知识必须全部到位”而且低估了卡点的常见性。汇编看不懂不是因为你笨而是因为你缺少具体的“上下文”——一个寄存器是什么不如一个栈溢出利用为什么要覆盖返回地址来得直观。解决卡住就跳过。把 Pwn 和 Reverse 这类硬骨头先放一放从 Web 和 Misc 建立信心等你能熟练读懂一段普通 C 语言代码时再回来看汇编。All-In-One 的目录是平面的没有任何规则要求你必须按目录顺序走完。学习顺序永远服务于保持动力而不是服务于目录的完整性。6. 进阶用法把文档章节变成你的训练循环6.1 用目录反向生成自测清单文档目录本身就是现成的能力清单。我的做法是每周挑一个方向把目录里的小节标题全部改写成“我会不会”的问句然后挨个自测。比如 Web 章节下“文件上传”这一节改写成自测问题就是这样章节自测问题Web / 文件上传我能默写出 3 类校验绕过方式吗Web / SQL 注入我能不查资料写出一次联合查询注入吗Crypto / RSA我能默写共模攻击的计算脚本吗Pwn / 栈溢出我能说出返回地址覆盖的整体步骤吗能独立写出和翻了文档才想起来是完全不同的两种掌握程度。这份清单把文档从“阅读材料”变成了“考试大纲”每次更新题库的时候顺便回填上次没答上来的内容学到的每一点都落在实处。6.2 把高频命令沉淀成速查卡我对每个方向的建议是用文档例题里的命令做底稿整理成一张“速查卡”每张卡只有命令和一句适用场景字段越短越好# 栈保护状态检查 checksec --file ./pwn # 查找 pop rdi; ret 指令位置 objdump -d ./pwn | grep pop.*rdi # 验证 payload 是否命中偏移 cyclic -l 0x6161616c速查卡攒到 50 张以上你的实战反应速度会明显快过临时翻文档。文档是后悔药能帮你补救没记住的内容而速查卡是把文档里最常用的内容变成你自己的东西。每次比赛后回填几张卡坚持两个赛季你会发现大部分初级题目根本不用回去翻 All-In-One直接靠卡片就能在十分钟内打出利用链。希望帮到你。本文还有配套的精品资源点击获取