CTF竞赛权威指南(Pwn篇)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 学习经验

1.3.1 二进制安全入门

二进制安全是一个比较偏向于底层的方向,因此对学习者的计算机基础要求较高,如C/C++/Python编程、汇编语言、计算机组成原理、操作系统、编译原理等,可以在MOOC上找到很多国内外著名高校的课程资料,中文课程推荐网易云课堂的大学计算机专业课程体系,英文课程推荐如下。

? Harvard CS50 Introduction to Computer Science

? CMU 18-447 Introduction to Computer Architecture

? MIT 6.828 Operating System Engineering

? Stanford CS143 Compilers

在具备了计算机基础后,二进制安全又可以细分为逆向工程和漏洞挖掘与利用等方向。学习的目标是掌握各平台上静态反汇编(IDA、Radare2)和动态调试(GDB、x64dbg)工具,能够熟练阅读反汇编代码,理解x86、ARM和MIPS二进制程序,特别要注意程序的结构组成和编译运行的细节。此阶段,大量动手实践是达到熟练的必经之路。推荐资料如下。

? Secure Coding in C and C++, 2nd Edition

? The Intel 64 and IA-32 Architectures Software Developer’s Manual

? ARM Cortex-A Series Programmer’s Guide

? See MIPS Run, 2nd Edition

? Reverse Engineering for Beginners

? 《程序员的自我修养——链接、装载与库》

? 《加密与解密,第4版》

接下来,就可以进入软件漏洞的学习了,从CTF切入是一个很好的思路。跟随本书的脚步,可以学习到常见漏洞(溢出、UAF、double-free等)的原理、Linux漏洞缓解机制(Stack canaries、NX、ASLR等)以及针对这些机制的漏洞利用方法(Stack Smashing、Shellcoding、ROP等),此阶段还可以通过读write-ups来学习。在掌握了这些基本知识之后,就可以尝试分析真实环境中的漏洞,或者分析一些恶意样本,推荐资料如下。

? RPI CSCI-4968 Modern Binary Exploitation

? Hacking: The Art of Exploitation, 2nd Edition

? The Shellcoder’s Handbook, 2nd Edition

? Practical Malware Analysis

? 《漏洞战争:软件漏洞分析精要》

有了实践的基础之后,可以学习一些程序分析理论,比如数据流分析(工具如Soot)、值集分析(BAP)、可满足性理论(Z3)、动态二进制插桩(DynamoRio、Pin)、符号执行(KLEE、angr)、模糊测试(Peach、AFL)等。这些技术对于将程序分析和漏洞挖掘自动化非常重要,是学术界和工业界都在研究的热点。感兴趣的还可以关注一下专注于自动化网络攻防的CGC竞赛。推荐资料如下。

? UT Dallas CS-6V81 System Security and Binary Code Analysis

? AU Static Program Analysis Lecture notes

如果是走学术路线的朋友,阅读论文必不可少,一开始可以读综述类的文章,对某个领域的研究情况有全面的了解,然后跟随综述去找对应的论文。个人比较推荐会议论文,因为通常可以在作者个人主页上找到幻灯片,甚至会议录像视频,对学习理解论文很有帮助。如果直接读论文则感觉会有些困难,这里推荐上海交通大学“蜚语”安全小组的论文笔记。坚持读、多思考,相信量变终会产生质变。

为了持续学习和提升,还需要收集和订阅一些安全资讯(FreeBuf、SecWiki、安全客)、漏洞披露(exploit-db、CVE)、技术论坛(看雪论坛、吾爱破解、先知社区)和大牛的技术博客,这一步可以通过RSS Feed来完成。随着社会媒体的发展,很多安全团队和个人都转战到了Twitter、微博、微信公众号等新媒体上,请果断关注他们(操作技巧:从某个安全研究者开始,遍历其关注列表,然后递归,即可获得大量相关资源),通常可以获得最新的研究成果、漏洞、PoC、会议演讲等信息甚至资源链接等。

最后,我想结合自己以及同学毕业季找工作的经历,简单谈一谈二进制方向的就业问题。首先,从各种企业的招聘需求来看,安全岗位相比研发、运维和甚至算法都是少之又少的,且集中在互联网行业,少部分是国企和银行。在安全岗位中,又以Web安全、安全开发和安全管理类居多,而二进制安全由于企业需求并不是很明朗,因此岗位仅仅存在于几个头部的甲方互联网公司(如腾讯、阿里等)的安全实验室,以及部分乙方安全公司(如360、深信服等)中,主要从事安全研究、病毒分析和漏洞分析等工作,相对而言就业面狭窄,门槛也较高。随着各种漏洞缓解机制的引入和成熟,软件漏洞即使不会减少,也会越来越难以利用,试想有一天漏洞利用的成本大于利润,那么漏洞研究也就走到头了。所以,如果不是对该方向有强烈的兴趣和死磕一辈子的决心,考虑到投入产出比,还是建议选择Web安全、安全管理等就业前景更好的方向。好消息是,随着物联网的发展,大量智能设备的出现为二进制安全提供了新的方向,让我们拭目以待。

1.3.2 CTF经验

CTF对于入门者是一种很好的学习方式,通过练习不同类型、不同难度的CTF题,可以循序渐进地学习到安全的基本概念、攻防技术和一些技巧,同时也能获得许多乐趣,并激发出更大的积极性。其次,由于CTF题目中肯定存在人为设置的漏洞,只需要动手将其找出来即可,这大大降低了真实环境中漏洞是否存在的不确定性,能够增强初学者的信心。

需要注意的是,对于初学者来说,应该更多地将精力放到具有一定通用性和代表性的题目上,仔细研究经典题目及其write-up,这样就很容易举一反三;而技巧性的东西,可以在比赛中慢慢积累。另外,选择适合自身技术水平的CTF是很重要的,如果跳过基础阶段直接参与难度过大的比赛,可能会导致信心不足、陷入自我怀疑当中。

就CTF战队而言,由于比赛涉及多个方向的技术,比拼的往往是团队的综合实力,因此,在组建战队时要综合考虑,使各个面向都相对均衡。赛后也可以在团队内做日常的分析总结,拉近感情、提升凝聚力。

随着计算机技术的发展、攻防技术的升级,CTF本身也在不断更新和改进,一些高质量的CTF赛事往往会很及时地跟进,在题目中融入新的东西,建议积极参加这类比赛。

1.3.3 对安全从业者的建议

此部分内容是TK教主在腾讯玄武实验室内部例会上的分享,看完很有感触,经本人同意,特转载于此,以飨读者。

1. 关于个人成长

(1)确立个人方向,结合工作内容,找出对应短板

? 该领域主要专家们的工作是否都了解?

? 相关网络协议、文件格式是否熟悉?

? 相关技术和主要工具是否看过、用过?

(2)阅读只是学习过程的起点,不能止于阅读

? 工具的每个参数每个菜单都要看、要试

? 学习网络协议要实际抓包分析,学习文件格式要读代码实现

? 学习老漏洞一定要调试,搞懂每一个字节的意义,之后要完全自己重写一个Exploit

? 细节、细节、细节,刨根问底

2. 建立学习参考目标

(1)短期参考比自己优秀的同龄人。阅读他们的文章和工作成果,从细节中观察他们的学习方式和工作方式。

(2)中期参考你的方向上的业内专家。了解他们的成长轨迹,跟踪他们关注的内容。

(3)长期参考业内老牌企业和先锋企业。把握行业发展、技术趋势,为未来做积累。

3. 推荐的学习方式

(1)以工具为线索

? 一个比较省事的学习目录:Kali Linux

? 学习思路,以Metasploit为例:遍历每个子目录,除了Exploit里面还有什么?每个工具怎么用?原理是什么?涉及哪些知识?能否改进优化?能否发展、组合出新的功能?

(2)以专家为线索

? 你的技术方向上有哪些专家?他们的邮箱、主页、社交网络账号是什么?他们在该方向上有哪些作品,发表过哪些演讲?跟踪关注,一个一个地学。

4. 如何提高效率

? 做好预研,收集相关前人成果,避免无谓的重复劳动

? 在可行性判断阶段,能找到工具就不写代码,能用脚本语言写就不要用编译语言,把完美主义放在最终实现阶段

? 做好笔记并定期整理,遗忘会让所有的投入都白白浪费

? 多和同事交流,别人说一个工具的名字可能让你节约数小时

? 处理好学习、工作和生活

? 无论怎么提高效率,要成为专家,都需要大量的时间投入