跳转至

编程与 CTF 学习路线

本栏目建立从高级语言、Web 文档到机器指令的完整知识链。重点不是背诵语法,而是理解数据如何表示、程序如何执行、输入如何跨越信任边界,以及如何用工具验证判断。

课程主线

主线 主要能力 典型 CTF 场景 建议基础
Python 自动化、文本与二进制处理、网络脚本 Misc、Crypto、Web、Pwn 辅助 可作为第一门语言
HTML 网页结构、表单、DOM、输出上下文 Web、XSS 分析 无
SQL 查询、连接、约束、索引、数据建模 Web、代码审计、数据库基础 基础编程与表结构概念
PHP 服务端请求处理、Session、数据库 Web 代码审计 HTML 与 HTTP 基础
C/C++ 类型、指针、内存、编译与链接 Reverse、Pwn 基础控制流
Rust 所有权、类型安全、系统开发与安全并发 Reverse、Pwn、工具开发 基础控制流与类型概念
x86-64 汇编 寄存器、栈、ABI、反汇编与调试 Reverse、Pwn C 与指针

HTML 是标记语言,不是传统意义上的编程语言,但它是理解浏览器、Web 表单和 XSS 上下文的必要基础。

推荐顺序

通用 CTF 路线

  1. 先学 Python,掌握变量、容器、函数、文件、字节和基础网络编程。
  2. 学 HTML,理解浏览器接收的文档、表单和 DOM。
  3. 学 SQL,理解关系型数据库中的查询、表结构和约束。
  4. 学 PHP,理解服务端如何读取请求、访问数据库并生成响应。
  5. 学 C/C++,建立类型、地址、生命周期、编译与链接模型。
  6. 学 Rust,通过所有权、Trait 和 Result 理解另一种资源与错误建模方式。
  7. 学汇编,把高级语言函数与寄存器、内存、调用约定对应起来。

Web 路线

Python 基础 -> HTML 与表单 -> HTTP 请求 -> SQL -> PHP -> 数据库安全 -> 输出编码与安全

Reverse/Pwn 路线

C 基础 -> 指针与内存 -> Rust 所有权 -> 编译和链接 -> x86-64 -> GDB/反汇编 -> 保护机制

所有语言共享的核心概念

数据与类型

程序处理的是具有表示方式和约束的数据。学习任何语言时都要问:

  • 值属于什么类型?
  • 类型转换是显式还是隐式?
  • 整数是否可能溢出?
  • 文本使用什么编码?
  • 当前对象或缓冲区是否可变?
  • 数据在内存、文件和网络中如何表示?

Python 的 str 与 bytes、C 的字符数组、PHP 的字符串以及 HTML 的 UTF-8 文档处于不同抽象层,不能因为都能“显示文字”就混为一谈。

控制流

分支、循环、函数调用和异常决定程序执行路径。高级语言中的 if、for 和函数调用,最终会表现为比较、跳转、栈操作和调用约定。Reverse 的重要任务之一,就是从低层控制流恢复高层结构。

状态与生命周期

状态可能位于局部变量、堆对象、文件、数据库、Cookie 或 Session 中。必须明确:

  • 谁创建它?
  • 谁拥有或共享它?
  • 谁可以修改它?
  • 它何时失效或释放?
  • 失败路径是否也会清理资源?

C/C++ 的悬空指针、Python 的共享可变对象和 PHP 的 Session 问题,本质上都与状态边界有关。

输入、验证与输出

命令行参数、文件、网络请求、数据库旧数据和反序列化内容都应视为不可信输入。安全处理通常分为三步:

  1. 按业务规则验证格式、长度、范围和允许值。
  2. 在内部使用明确的数据类型和结构处理。
  3. 在 SQL、HTML、命令行或文件路径等具体输出位置使用对应的安全 API。

不存在适用于所有场景的“万能过滤”。参数化 SQL、HTML 上下文转义和安全进程 API 解决的是不同问题。

执行模型

  • C/C++ 通常先编译为目标文件,再由链接器生成机器码程序。
  • Rust 通常由 rustc 编译并链接为原生程序,Cargo 负责包、依赖和构建工作流。
  • 汇编器将助记符转换为机器指令,但符号和地址仍可能需要链接处理。
  • CPython 通常先生成字节码,再由虚拟机执行,也可能加载原生扩展。
  • PHP 源码由相应 SAPI 执行,生产环境常配合 PHP-FPM 和操作码缓存。
  • HTML 不执行算法;浏览器解析字节流并构建 DOM,再结合 CSS 和 JavaScript 工作。

理解具体工具链比给语言贴单一的“编译型”或“解释型”标签更有价值。

学习方法

每学一个主题,都应完成四类练习:

  1. 预测:运行前写出预期结果和理由。
  2. 验证:使用编译器、解释器、浏览器开发者工具或调试器观察实际行为。
  3. 变形:修改类型、边界、输入和错误路径,观察规则何时变化。
  4. 复盘:解释错误属于语法、类型、运行时、协议还是安全边界问题。

建议把示例保存在独立练习目录,并使用版本控制记录每次实验。不要只复制代码而不理解输入、输出和失败条件。

安全学习边界

安全与 CTF 章节用于本地实验、课程靶场和明确授权的竞赛环境。学习目标是理解漏洞成因、识别危险模式、验证保护机制并编写安全代码,不应将示例用于未授权系统。

完成本栏目后,应能够沿着以下路径解释一个程序:

用户输入 -> 语言对象/缓冲区 -> 控制流与函数 -> 文件/数据库/网络
        -> 编译器或运行时 -> 操作系统 -> CPU 指令与内存