网络安全是一门覆盖范围广、涉及程度深、相关知识多、所需技能杂的学科,而 CTF竞赛是对网络安全专业能力的一种综合考查和实际检验,非常强调知识基础和动手能力并重。因此,对网络安全课程进行全面、深入、科学的学习可以说是参加 CTF 竞赛首要且应长期坚持的一项准备工作。本节对 CTF 竞赛需要的前序课程中最重要的一部分进行介绍。需要注意的是,这并不意味着必须学完所有这些课程才可以开始参与 CTF 竞赛,完全可以边学习课本知识边尝试动手实践。在动手实践中更加深入地了解课本知识的含义,可能正是最适合网络安全专业的学习方法之一。
小贴士: 为便于读者学习,对本节提到的课程,本书列举了一些参考教材、书籍或者公开课供读者参考。本书列举的不一定是该课程最权威、最全面、最深入的学习资料,还会考虑是否适用于网络安全方向。读者也可以抛开这里的推荐,自行选择喜欢或方便获得的资料。
目前,网络安全和 CTF 竞赛的内容绝大部分还是与计算机程序密切相关的,因此关于程序编写及运行的知识是进行进一步学习的基础,这些知识主要包括高级程序设计语言、汇编语言、编译原理、计算机系统原理、数据库等。
高级程序设计语言的知识主要出现在程序设计、数据结构、面向对象编程等课程中。要通过学习这些知识,形成分析问题并通过计算机程序解决问题的思维方式,掌握数据类型、基本运算、逻辑控制、数组、结构、指针、函数、对象等基本概念,熟悉各类数据结构的特点及实现,了解面向对象编程的概念,掌握2~3门高级程序设计语言的编程、调试、运行。建议重点关注C/C++语言及Python语言,前者是当前网络安全研究和CTF竞赛命题的主要目标对象,后者便于读者实现快速开发,提高 CTF 竞赛解题和网络安全研究的效率。在掌握C/C++语言和Python语言之后,再学习其他高级程序设计语言就会比较容易。
汇编语言是计算机相关专业的一门重要的专业基础课,通过学习它既可以对计算机系统中的指令执行、存储管理、系统I/O等有一个本质而直观的认识,又可以对高级程序设计语言中的变量组织、地址访问、逻辑控制、函数调用等有一个深入而准确的理解。从网络安全学习和 CTF 竞赛的角度来看,汇编语言的学习尤其要注意以下两点:一是汇编语言与计算机的体系结构和指令集密切相关,因此在学习过程中主要是领会其思想和逻辑,如实模式与保护模式、编址与寻址等,至于具体的指令形式,在需要时查阅相关手册即可;二是学习汇编语言的落脚点始终是网络安全研究,因此要重点关注与网络安全问题关联紧密的寄存器、内存访问、数据处理、跳转方式、函数调用等内容,如何通过汇编语言编程实现复杂的功能则不是学习的重点。汇编语言的学习通常从学习16位8086指令集的汇编入手,推荐阅读王爽的《汇编语言(第4版)》。学习32位x86指令集的汇编则推荐阅读Kip R.Irvine的《汇编语言:基于x86处理器(第7版)》。
编译原理主要介绍高级程序设计语言的源代码是如何成为可以在计算机上运行的二进制程序的,通过学习它可以帮助理解程序的执行过程,提高对计算机系统的总体认识。学习编译原理的难度较大,但与汇编语言类似,读者只需要关注其中与网络安全相关的知识即可,主要包括编译的过程、编译器各组成部分的作用及实现方法、中间代码、目标代码、符号表、运行时存储空间组织等。推荐结合斯坦福大学的在线课程Compilers来进行学习。
计算机系统原理相关的知识除了散见于上述几门课程外,还可能涉及计算机组成原理、计算机体系结构等课程。其中,需要重点了解和掌握的知识有信息的表示及处理、CPU 体系结构、存储器、虚拟内存、链接、异常处理、程序间交互及通信等。推荐阅读Randal E.Bryant和David O'Hallaron的《深入理解计算机系统(第3版)》。
此外,还需要了解一点基本的数据库知识,包括数据库系统的概念、关系数据库、SQL语言、数据库完整性、数据库安全性等。重点是掌握通过SQL语言进行数据的插入、删除、修改、查询等基本操作的方法,要能够灵活运用、举一反三。推荐阅读王珊和萨师煊的《数据库系统概论》。
网络安全离不开计算机网络,在 CTF 竞赛中也大量涉及计算机网络方面的知识,因此有必要对计算机网络相关课程进行全面、深入的学习和探究。
首先,需要对计算机网络的概念、理论和方法进行全面的学习,了解计算机数据通信、网络体系结构、网络标准、局域网、广域网等基本概念及理论,掌握网络协议的层次模型和应用层、传输层、网络层、数据链路层、物理层的常见协议及实现方法。推荐阅读James F. Kurose和Keith W. Ross的《计算机网络:自顶向下方法(第7版)》。
其次,从网络安全的角度出发,需要进一步对计算机网络协议的深层次原理、设计思路及实现细节进行深入探究,做到知其然且知其所以然,真正理解计算机网络的精髓及其局限性。重点关注网络层、传输层及应用层协议及相关技术,具体包括重要协议和网络地址结构及解析、网络地址扩展及转换、路由算法、可靠数据传输、滑动窗口机制、拥塞控制等关键技术。推荐阅读Kevin R. Fall和W. Richard Stevens的《TCP/IP详解 卷1:协议(第2版)》。
最后,从实战角度考虑,还需要具备一定的计算机网络应用技能,主要包括具有基于路由器、交换机等设备进行网络配置与维护的能力,具有结合Wireshark等工具进行网络数据包抓取与分析的能力,以及利用 Socket 套接字进行网络编程与应用开发的能力等。当然,提升实际动手能力本来就是参赛者参加CTF竞赛的目的,因此这些技能都可以在参与CTF竞赛的过程中同步学习。
操作系统控制着计算机资源调度的优先级,管理着计算机的内存和输入输出设备,向计算机的用户提供文件系统和网络支持,并与形形色色的安全保护机制密切相关,堪称计算机系统的核心与基石。因此,参赛者在学习网络安全和参加 CTF 竞赛前应该了解一些关于操作系统的知识。
首先,需要学习操作系统中必不可少的几个基本模块,包括 CPU 管理、内存管理、文件系统管理、输入输出管理等,掌握不同模块之间的内在联系及操作系统的启动装载、接口调用、通信机制、死锁处理等知识,初步具备阅读及分析开源操作系统的能力。推荐阅读Abraham Silberschatz等的《操作系统概念(第9版)》。
之后,与计算机网络类似,有必要对操作系统的深层次原理、设计思路及实现细节进行更为深入的探究。尤其推荐将主流的、开放源代码的、也是 CTF 竞赛中经常使用的 Linux系统作为学习的对象,一方面熟悉Linux系统的操作与使用,另一方面了解一个真正可用的、现代的操作系统是如何实现的,又是如何稳定工作的,从而加深对操作系统核心原理和关键技术的理解。在不断深入学习的过程中,推荐阅读 Remzi H. Arpaci-Dusseau 和 Andrea C. Arpaci-Dusseau的《操作系统导论》。具体到Linux系统,也可以参考Robert Love的《Linux内核设计与实现(第3版)》。
需要说明的是,学习操作系统的主要目的在于加深对网络安全研究对象和网络安全问题本质的认识,从而在遇到逆向分析或漏洞利用等问题时能够理解得更加透彻,帮助人们更好地解决这些问题。因此在学习操作系统相关课程时应该将重点适当地偏向于对已有操作系统的分析与掌握,而不必动手实现一个完整的操作系统。要注意抓住学习的重点,以便在节约时间与精力的同时取得良好的学习效果。
密码学所涉及的课程在整个网络安全课程体系中相对独立,主要是以初等数论和近世代数为核心的数学类课程和以网络密码为核心的密码学课程。
初等数论可作为独立的课程学习,其知识也会出现在离散数学或信息安全数学基础等课程中,要深入了解带余除法、同余、素数、合数、互素、最大公约数、最小公倍数、离散对数等重要概念,重点掌握整数的唯一分解、欧几里得算法、素性判定、欧拉函数、费马小定理、孙子剩余定理等常用结论。推荐阅读Kenneth H.Rosen的《离散数学及其应用(第8版)》,或Joseph H.Silverman的《数论概论(第4版)》。
近世代数的知识主要出现在信息安全数学基础或高等代数、抽象代数等课程中,要深入了解群、环、域、有限域、群的阶、元素的阶、同态、同构等重要概念,重点掌握有限域的存在性及唯一性、有限域的结构、域的扩张等常用结论。推荐阅读丘维声的《近世代数》。
小贴士: 事实上CTF中涉及的数学知识还包括线性代数、概率论与数理统计等传统工科数学课程中的一些知识,例如线性代数中的矩阵相关知识,概率论中的概率相关知识等。但由于这些知识在CTF中的重要程度相对较低,因此本书就不展开介绍了。总体而言,学好数学肯定是没有错的。
网络密码的知识主要出现在密码学原理等课程中,要了解香农定理、计算安全性理论、NP 完全问题等密码学理论基础,以及移位寄存器、椭圆曲线等基本概念,掌握古典密码、分组密码、序列密码、非对称密码、哈希函数的原理和算法,以及数字签名、密钥管理等网络密码重要应用。推荐阅读William Stallings的《密码编码学与网络安全:原理与实践(第8版)》或Jonathan Katz的《现代密码学:原理与协议》,也可以通过斯坦福大学的在线课程Cryptography I来进行学习。