首页 / 资讯中心 / 文章详情

CTF全栈复习知识地图:六类题型与工具链查漏补缺

CTF全栈复习知识地图:六类题型与工具链查漏补缺 ★ FEATURED ARTICLE
简介《CTF-All-In-One》面向网络安全初学者与竞赛选手系统梳理夺旗赛从入门到进阶的知识链路。压缩包内仅含 1 个 PDF 文件体积约 6.69MB这一册即囊括基础知识、工具、分类专题、技巧、高级技术与题解实战等板块。内容从 CTF 赛制、解题模式与攻防模式讲起覆盖 Linux 与 Web 安全基础、逆向所需的汇编与 ELF/PE 结构、密码学数论与公钥算法、Android 与 Dalvik 指令集并梳理 gdb/peda、IDA Pro、pwntools 等常用工具专题部分深入栈溢出、ROP、格式化字符串、堆利用与内核漏洞利用并延伸至 Fuzz 测试与符号执行。后半部分配以 pwn、re、web 真实赛题题解与多个 CVE 分析案例形成从原理到复现的完整流程。已有 599 人学习可按目录逐章推进也适合作为备赛查阅手册。1. 知识地图CTF 全栈复习先看链路再看六类题型把这份 CTF 学习文档摊开它更像一张网络安全攻防知识地图左侧是 Linux、Web 协议、逆向、密码学与移动安全的基础底座右侧是 PWN、WEB、Reverse、Crypto、Misc、Mobile 六类题型中间由工具链和赛题复盘串成一条线。适合已经学过一点编程、正在系统准备 CTF 的人复习时先看链路再按题型补细节。资料目录覆盖基础知识、工具、分类专题、技巧、高级、题解、实战与附录恰好能当作地图骨架。梳理下来会发现最怕的不是题难而是“知识块之间没有接口”Linux 命令会敲但不懂进程Web 会背漏洞名但不会还原请求Pwn 会套模板但不会看保护Crypto 会跑脚本但不会验条件。先建立链路再逐个填坑复习才不会越学越散。2. 基础底座Linux、Web 协议与逆向前置的复习重点基础底座决定后面题型能不能读懂。这一块不是“随便翻翻”的章节而是所有题目的共同入口Linux 决定你能不能看进程、文件和权限Web 协议决定你能不能判断请求从哪来、数据到哪去逆向前置决定你看到二进制文件时是把它当黑匣子还是能拆成函数、节区和内存布局。重点不是把命令表背全而是建立“输入—处理—输出”的观察习惯。2.1 Linux 命令行、权限与进程观别停在“会用 ls”Linux 基础在资料里被拆成常用命令、Bash 快捷键、根目录结构、进程管理、UID 与 GID、权限设置、字节序、输入输出、文件描述符、核心转储、调用约定、环境变量和 /proc/[pid]。复习时建议按“观察系统状态”分组而不是按字母顺序背。文件与目录类命令解决定位进程类命令解决谁在跑权限类命令解决谁能读写的边界输入输出与文件描述符解决数据流向/proc 解决运行时信息。复习层次必会动作常见误用文件与目录定位文件、看权限、改属主只看文件名不看权限位进程查进程、看资源、结束异常进程不区分进程号与父进程权限理解 UID/GID、读写执行位把 chmod 777 当万能解输入输出管道、重定向、文件描述符不清楚标准输出与错误输出运行时看 /proc/[pid] 与环境变量忽略环境差异导致复现失败权限这一块最容易“一看就会、一用就错”。UID 和 GID 决定进程以谁的身份运行权限位决定文件能不能被读、写、执行设置权限时还要区分文件与目录的执行位含义。目录的执行位通常代表能否进入文件的执行位才代表能否作为程序运行。复习时把“谁能访问—以什么身份访问—访问后留下什么”串起来比单背命令有用。进程与文件描述符是后面调试和漏洞利用的底子。一个程序打开文件、套接字、管道背后都落到文件描述符标准输入、标准输出、标准错误只是最常见的三个。遇到程序输出混乱、脚本交互对不上、重定向后行为变化先查文件描述符和缓冲不要急着怀疑题目。核心转储和调用约定也要提前看否则后面看到栈帧、寄存器传参、崩溃现场会接不上。注意Linux 基础复习不要只做命令清单最好给每个命令配一个“我为什么用它”的场景否则到了 Pwn 和 Web 题里仍然想不起来。2.2 Web 三件套与服务器指纹HTML/HTTP/JavaScript 要连起来Web 安全基础在目录里分成 HTML、HTTP 协议、JavaScript、常见 Web 服务器、常见 Web 漏洞清单和 PHP 源码审计。很多人复习 Web 时直接跳到 SQL 注入和 XSS结果连请求怎么构造、参数从哪里进入、服务端怎么处理都说不清。更稳的顺序是先看 HTML 表单和链接如何产生请求再看 HTTP 请求行、请求头、请求体、状态码、Cookie 和缓存再看 JavaScript 在前端做了哪些校验和跳转最后才进入漏洞类型。HTTP 协议要重点抓“边界”方法、路径、协议版本、Header、空行、Body。GET 与 POST 的差异不只是参数位置还影响缓存、日志、长度限制和服务端解析。Content-Type 决定服务端如何解释 BodyCookie 和 Session 决定身份如何延续重定向和状态码决定你看到的页面是不是最终页面。复习时拿一个登录请求做拆解谁发起的、带了什么头、参数编码是什么、服务端返回了什么、浏览器又自动补了什么。JavaScript 基础不要当成前端开发课。CTF 里的 JS 常见作用是前端校验、参数拼接、跳转、编码混淆和接口调用。看到“前端已经拦住了”不要放心前端校验只是提示真正要判断的是服务端有没有重复校验。常见 Web 服务器基础则用来建立指纹意识不同服务器对路径、Header、错误页、默认文件、解析规则的处理不同指纹判断能帮你缩小测试面。PHP 源码审计基础是 Web 题型的分水岭。复习时重点看输入从哪里来、有没有过滤、过滤发生在哪一层、拼接后进入什么函数、输出到哪里。SQL 注入看的是参数进入查询的方式XSS 看的是输出上下文和编码文件包含看的是路径拼接与包含逻辑代码执行看的是危险函数与可控参数。把“数据流”画出来比背漏洞名称更抗变题。2.3 逆向前置C、汇编、ELF/PE、链接与内存管理逆向工程基础在资料里列得很细C 语言基础、x86/x86-64 汇编、Linux ELF、Windows PE、静态链接、动态链接、内存管理、glibc malloc。这一块的重点是建立“源码—汇编—可执行文件—运行时内存”的四层映射。C 语言要重点看指针、数组、结构体、函数调用、作用域和未定义行为汇编要重点看寄存器、指令寻址、栈帧、调用约定和条件跳转。ELF 与 PE 是两种可执行文件格式复习时不要混着记。先看文件头、节区/段、入口点、导入导出符号、重定位信息再看动态链接如何解析外部函数。静态链接把库代码放进程序动态链接在运行时解析依赖这会影响你调试时看到的地址、符号和调用路径。内存管理要能说清栈、堆、全局区、代码区的大致分布以及函数调用时返回地址、保存的栈帧指针、局部变量如何排列。glibc malloc 是 Pwn 堆题的前置不建议一上来就背堆利用技巧。先把分配器的最小概念弄明白分配、释放、合并、回收、元数据放在哪里、不同大小请求走什么路径。复习时可以用“申请—写入—释放—再申请”的小程序观察行为再去看堆题。最容易翻车的是把“会调用 malloc”当成“懂堆布局”一到实际题目就不知道 chunk 头在哪里、为什么释放后还能被读写。2.4 密码学与 Android补课顺序和最小知识集密码学基础包括初等数论、近世代数、流密码、分组密码、公钥密码、哈希函数、数字签名。复习顺序建议从“能算”开始模运算、最大公约数、逆元、素数判断、离散对数基本概念再进入分组模式、填充、初始向量、公钥体制和签名验证。古典密码可以放在 Crypto 题型里练手但不要挤占现代密码的基础时间。流密码与分组密码的重点不同。流密码看密钥流如何产生、是否复用、明文与密文如何异或分组密码看分组长度、模式、填充、IV 和错误传播。公钥密码看密钥对、加密与签名不是一回事哈希看单向性、碰撞与长度扩展这一类边界。数字签名要能区分“加密让谁看”和“签名让谁验”否则遇到协议题会把方向做反。Android 安全基础在目录里包括环境搭建、Dalvik 指令集、ARM 汇编基础和常用工具。复习时先搭好可运行的分析环境再看 APK 结构、Dalvik 字节码、ARM 汇编与 Java/Kotlin 代码之间的对应关系。重点不是把所有指令背完而是能定位入口、找到关键校验、判断是 Java 层还是 native 层。Mobile 题常和 Reverse 交叉基础打牢后迁移成本会低很多。3. 工具链分工调试、反汇编、抓包与脚本各管哪一段工具链最容易学成“按钮大全”。真正有效的复习方式是按任务分工动态调试看运行时状态静态反汇编看控制流和数据结构抓包代理看请求响应脚本负责批量交互和复现。工具只是观察手段先明确“我现在要回答什么问题”再选工具。否则工具开了一堆结论还是靠猜。3.1 动态调试与静态反汇编先明确问题再选工具动态调试解决“运行到某处时寄存器和内存是什么”。命令行调试器适合看断点、寄存器、栈、内存映射和调用栈带图形反汇编视图的调试器适合看控制流和交叉引用内核场景要换内核调试器移动端则要配合移动平台的反编译与调试工具。复习时给每类工具配一个问题这个值什么时候被改写、这个分支为什么走不到、这个函数参数从哪里来。静态反汇编解决“不运行程序时结构长什么样”。重点看函数边界、字符串引用、导入函数、常量、条件跳转和循环。反编译视图能加速理解但不能完全替代汇编遇到混淆、花指令、反调试时还是要回到指令层。动态与静态不是二选一常见组合是静态定位关键比较动态下断点验证输入再回到静态补全数据结构。任务优先手段观察输出找输入校验点静态字符串与交叉引用比较指令、跳转条件看运行时参数动态断点与寄存器寄存器值、栈内容判断保护机制文件结构与加载信息段权限、重定位、符号分析移动端反编译加动态调试Java/native 边界复现崩溃核心转储加调用栈崩溃地址、回溯链复习时把“工具输出”转成“可验证结论”。比如看到某个比较指令不要只写“这里比较了”要写“比较的是输入第几位、失败跳转到哪里、成功继续到哪个函数”。看到栈上某个值不要只截屏要写“这个值来自哪个参数、偏移多少、覆盖后影响哪个返回地址”。这种转写训练比重复开工具更能提升。3.2 抓包、代理与 Web 测试请求改写比扫漏洞更基础Web 工具链的核心是请求改写与响应观察。代理抓包能看到浏览器和服务端之间的真实请求重放能验证参数影响编码工具能处理 URL、Base64、JSON、表单和 multipart。复习时先把一个请求完整拆开请求行、Header、Cookie、Body、Content-Type、编码方式再逐项改动观察状态码、响应长度、页面内容和跳转变化。抓包不是“看流量”而是“建立因果”。改一个参数响应哪里变了删一个 Header鉴权是否失效换一个 Content-Type服务端是否还按原格式解析加一个编码层过滤是否被绕过。SQL 注入和 XSS 的验证都要回到数据流输入进入哪里、经过什么处理、输出到什么上下文。只会跑扫描结果遇到自定义过滤就会停住。文件上传、文件包含、命令执行这类题还要关注路径和解析。上传看文件名、扩展名、MIME、内容检测、存储路径和访问方式包含看路径拼接、协议封装、截断和权限命令执行看拼接符、参数分隔、过滤黑名单和回显。复习时用“请求—服务端处理—结果”三列记录比只记 Payload 更清楚。3.3 二进制利用脚本用标准库写最小交互模板Pwn 题离不开脚本交互。复习初期不必追求复杂框架先用标准库把“连接—对齐提示—发送—接收—判断”跑通能减少环境依赖。下面是一个最小模板重点看参数位置和打包方式。import socket import struct HOST 127.0.0.1 # 本地联调地址实际环境按题目给的地址替换 PORT 10001 # 本地监听端口按题目环境修改 OFFSET 0x20 # 到返回地址的偏移必须用调试器或 pattern 实测 RET 0x401234 # 占位返回地址实际按目标程序改 payload bA * OFFSET struct.pack(Q, RET) with socket.create_connection((HOST, PORT), timeout3) as s: s.recv(1024) # 先对齐程序提示符避免发送过早 s.sendall(payload b\n) # 发送载荷并补换行 data s.recv(4096) # 读取回显确认是否命中 print(data)这段代码里HOST和PORT是联调参数换环境只改这两处OFFSET不能照抄必须用崩溃偏移或调试器确认struct.pack(Q, RET)表示按小端打包 64 位地址32 位程序要换成Irecv用来对齐提示符sendall保证完整发送。脚本跑不通时先看连接是否建立、提示符是否对齐、载荷是否被截断再回头查偏移和地址不要一上来就改利用链。提示脚本里保留注释和参数名比把地址硬编码在表达式里更容易复盘下一次遇到同类题改参数就能复用。3.4 高级工具链Fuzz、插桩、符号执行、SMT 与模拟器高级篇在目录里包括 Fuzz 测试、动态二进制插桩、符号执行、Clang/LLVM、反汇编与汇编引擎、SAT/SMT、反调试、反编译和模拟器。复习时不要被名词吓住先按“解决什么问题”归类Fuzz 解决输入空间探索插桩解决运行时观测符号执行解决路径约束求解SMT 解决约束可满足性模拟器解决不依赖真实环境执行指令。Fuzz 的重点是种子、变异、覆盖率反馈和崩溃去重。复习时先跑一个最小目标理解输入如何喂给程序、崩溃如何被捕获、覆盖率如何反馈。插桩的重点是插在什么位置、收集什么数据、对性能影响多大。符号执行的重点是路径爆炸和约束表达遇到复杂循环不要硬跑先缩小输入范围。SMT 求解器适合把约束转成可满足性问题但约束写错会得到“看似正确”的错解。反调试与反编译是逆向的高级延伸。反调试看程序如何检测调试器、如何改变控制流、如何制造假分支反编译看工具输出与真实语义的差距尤其是优化、混淆和数据结构恢复。模拟器适合跑片段指令或脱离原环境观察行为但不能假设模拟结果等于真实运行结果。高级工具链复习的底线是知道它适合回答哪类问题知道它什么时候会骗你。4. 题型模块Reverse、Pwn、Web、Crypto、Misc、Mobile 的要点对照题型模块是地图上的“应用层”。资料把分类专题拆成 Reverse、Crypto、Pwn、Web、Misc、Mobile又把 Pwn 细到格式化字符串、整数溢出、栈溢出、ROP、Linux 堆利用、内核 ROP、Linux/Windows 内核漏洞利用把 Web 细到 SQL 注入和 XSS。复习时不要按题名背套路而要按“输入入口—关键处理—可利用点—验证方式”建立对照表。4.1 Reverse入口、关键比较与反调试Reverse 的核心是定位关键逻辑。先从入口和主流程开始找输入、找比较、找成功/失败分支再看是否有反调试、壳、混淆或自修改代码。静态分析给结构动态调试给事实字符串、导入函数、常量、交叉引用都是路标。遇到程序很大时不要从头到尾读先找“用户输入影响哪个分支”这条线。关键比较要看到指令层比较的是什么、长度多少、逐字节还是整体、失败后是否还有二次校验。很多题不是只有一个判断而是多层校验叠加。复习时把每个校验点记成“输入位置—变换方式—比较对象—绕过条件”。反调试则要判断检测发生在启动、运行中还是异常处理阶段绕过方式可能是改标志、改跳转、补丁指令或换调试环境。4.2 Pwn栈、堆、格式化字符串与内核利用分层Pwn 的分层很清楚格式化字符串看参数泄露与任意写整数溢出看边界与符号栈溢出看偏移、保护与返回地址ROP 看 gadget 链与调用约定堆利用看分配器行为与元数据内核利用看权限边界与内核对象。复习时先把用户态栈题打牢再进入堆再碰内核顺序反了会到处漏。栈题的重点是保护机制和偏移。看 Canary、NX、PIE、RELRO判断能不能直接覆盖返回地址、要不要先泄露地址、有没有可写可执行区域。ROP 的重点是 gadget 质量、寄存器控制、函数调用参数和栈对齐堆题的重点是分配大小、释放顺序、重复释放、越界写和元数据破坏。格式化字符串要能区分泄露和写入写入还要看宽度、长度和目标地址。内核题不要只背利用链。先理解用户态到内核态的切换、系统调用入口、内核对象生命周期和权限检查位置。资料把 Linux 内核漏洞利用和 Windows 内核漏洞利用分开复习时也要分开看环境、调试手段和对象模型。内核题翻车往往不是利用思路错而是环境没对齐、符号没加载、崩溃现场没读对。4.3 WebSQL 注入、XSS 与源码审计的检查线Web 题型要按数据流复习。SQL 注入看参数进入查询的方式拼接、预编译、过滤、编码、二次注入XSS 看输出上下文HTML 正文、属性、脚本、URL、富文本文件包含看路径拼接和包含协议上传看扩展名、MIME、内容和访问路径命令执行看拼接符、参数分隔和过滤。每个点都要能画出“输入—处理—输出”。源码审计的检查线可以固定为入口文件、路由分发、参数获取、过滤函数、危险函数、数据库操作、模板输出、文件操作、日志与错误处理。先找可控输入再追到危险函数再看过滤是否能绕过。不要看到危险函数就下结论也不要看到过滤就放弃关键是过滤发生在数据流哪一段是否覆盖了所有路径。4.4 Crypto 与 Misc古典、现代、编码与取证Crypto 题分古典和现代。古典密码看替换、移位、频率、词频和已知明文现代密码看分组模式、填充、IV、密钥复用、公钥参数和签名验证。编码不是加密Base 系列、URL 编码、十六进制、压缩、序列化经常多层嵌套。复习时先判断“这是编码、古典还是现代”再选工具方向判断错脚本跑得再快也没用。Misc 覆盖面广资料里提到隐写、流量分析、取证、数据分析等。复习时重点建立检查顺序文件类型与尾部数据、图片/音频/压缩包结构、编码层级、流量时间线、协议字段、异常长度和异常时间。Misc 最容易堆工具但真正有效的是“先看结构再看异常最后才上工具”。4.5 MobileDalvik、ARM 与常见工具Mobile 以 Android 逆向为主复习点包括环境搭建、Dalvik 指令集、ARM 汇编和常用工具。先看 APK 结构再定位入口 Activity、关键校验和 native 库Java 层看反编译代码native 层看 ARM 汇编和动态调试。Dalvik 指令集不必全背但要能读懂方法调用、字段访问、条件跳转和异常处理。Mobile 与 Reverse 的交叉很多字符串混淆、反射调用、动态加载、native 校验、反调试。复习时把“Java 层—JNI 边界—native 层”的调用链画出来再决定在哪一层下断点。工具只是辅助关键还是定位输入和校验点。5. 易错点清单五个“以为会了其实没会”的复习漏洞易错点章节不是补充题而是复习的校准器。很多知识点“看的时候懂、做的时候错”不是因为没学过而是因为没有建立检查动作。下面五个点是梳理 CTF 全栈资料时最容易反复踩的坑。每个点都按“易漏点—为什么漏—怎么补”拆开方便直接改成自己的复盘清单。5.1 易漏点一只记工具按钮不记输入输出边界易漏点工具用得很熟但说不清输入是什么、输出是什么、中间状态在哪里。比如调试器会下断点却不知道断点命中时参数在哪个寄存器抓包工具会重放却不知道改哪个字段会影响服务端解析反汇编器会看伪代码却不知道伪代码和真实指令的差异。为什么漏工具界面把复杂度藏起来了按钮一点就有结果容易让人误以为“结果就是结论”。复习时如果只记录“用了什么工具”不记录“工具回答了什么”下次换环境就会失效。工具的输出是观察不是判断判断要靠输入输出边界和因果链。怎么补每用一次工具强制写三行输入是什么、我改了哪个变量、输出证明了什么。调试时记录寄存器/栈/内存地址的变化抓包时记录请求行/Header/Body 的改动和响应差异反汇编时记录函数边界、交叉引用和调用约定。坚持一段时间工具才会从黑匣子变成可复用的观察手段。5.2 易漏点二Pwn 只背模板不核对保护与 libc易漏点看到栈溢出就套“偏移 返回地址”看到堆题就套“申请释放再申请”但没有先核对架构、保护、libc 版本和调用约定。模板在一种环境能打通换一台机器就翻车最后归因于“玄学”。为什么漏模板把关键假设省略了。偏移可能因编译选项变化返回地址可能受 PIE 影响函数调用可能受栈对齐影响libc 版本不同会导致符号偏移和利用链差异。只背模板等于把假设当事实。怎么补每次先做环境核对文件架构、位数、保护项、动态链接依赖、libc 版本、调用约定。用调试器确认偏移和崩溃点用文件结构确认段权限和重定位用最小脚本验证一次交互。模板可以留但模板前面要加“环境检查”步骤后面要加“失败时看什么”的记录。5.3 易漏点三Web 只背漏洞名不还原数据流易漏点能说出 SQL 注入、XSS、文件包含、命令执行但拿到一个请求不知道怎么追输入看到过滤函数就判断“打不了”看到回显就判断“成功了”。漏洞名背得熟数据流画不出。为什么漏漏洞名是结果标签不是分析过程。Web 题的变化主要在入口、过滤、编码、输出上下文和中间件解析。只背标签遇到自定义路由、二次编码、白名单、模板转义就会失去方向。怎么补固定画一条线参数从哪里来、经过哪些函数、进入什么危险操作、输出到什么上下文、有什么过滤和编码。每改一个 Payload记录服务端响应差异不要只看“有没有弹窗”。源码审计时先找可控输入再追危险函数最后验证过滤覆盖范围。数据流清楚漏洞名才有意义。5.4 易漏点四Crypto 只套脚本不验证数学条件易漏点拿到题就找现成脚本改参数跑一遍结果不对就换脚本。没有先判断是编码、古典密码还是现代密码也没有验证模运算、素数、逆元、填充、IV、密钥长度这些条件。为什么漏脚本把数学条件藏在参数里。条件不满足时脚本可能不报错只是输出垃圾多层编码时解错一层后面全错。只套脚本容易把“跑通”当成“解对”。怎么补先做题型判断再做条件检查模数是否互素、指数是否可逆、分组长度是否匹配、填充是否合法、IV 是否复用、签名验证是否通过。每跑一个脚本记录输入格式、参数含义和输出验证方式。解出来以后用另一条路径交叉验证比如重新加密、检查格式、比对已知明文。5.5 易漏点五Misc 忽略编码层级与流量时间线易漏点看到文件就上工具看到流量就搜字符串忽略多层编码、文件尾附加数据、协议字段顺序和时间线。工具扫出一堆结果不知道哪个有用。为什么漏Misc 的线索常常不在显眼位置而在结构、长度、时间、编码层级和异常字段里。只靠工具扫描容易把正常数据当异常也容易漏掉需要按顺序还原的内容。怎么补先看文件类型、结构、尾部数据和元信息再按“编码层级”逐层剥流量题先排时间线看请求响应顺序、协议字段、异常长度和重放关系。每得到一个候选结果问一句“它和题目格式是否吻合”。Misc 的后悔药就是检查顺序顺序对了工具才有意义。6. 复习清单把 CTF 知识地图压缩成一周可执行的查漏补缺表最后落到可执行清单。不要按“我今天看了几页”验收而按“我今天产出了什么”验收一张数据流图、一份环境核对记录、一个可复现脚本、一条错题归因。下面这张表可以按自己的薄弱项替换顺序但每天都要有一个可检查的输出物。天数复习动作验收标准第 1 天画全栈地图标出 Linux、Web、逆向、密码学、移动安全与六类题型能说清每块知识服务于哪类题第 2 天拆一个 Web 请求追参数到危险函数画出输入—过滤—输出数据流第 3 天做一个二进制环境核对记录架构、保护、依赖能解释每个保护项影响什么第 4 天写最小交互脚本跑通本地联调能定位偏移、提示符和回显问题第 5 天复盘一道 Reverse 或 Mobile标关键比较与调用链能说清 Java/native 或源码/汇编边界第 6 天做一组 Crypto 或 Misc先判断类型再上工具能写出条件检查和交叉验证第 7 天整理错题按“易漏点—为什么漏—怎么补”归档每个错题有下一次的检查动作这张表的关键不是七天排满而是每天都有一个“能拿出来看”的产出。复习时最容易自欺欺人的是“我看过了”最可靠的是“我能复现、能解释、能改参数”。从那以后我每次复盘都强制先画知识地图再补错题归因不再用翻页数量安慰自己希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站