浸淫二进制已久,几年来学习途径上也颇为坎坷,每每苦于没有一套完整的纲要,尤在入门开荒期间,上下而求索。一直以来都想自己规划出一套二进制安全系列的教纲,从上古时期到现代的技术细节,汇集整理所学所想,承百家之技艺,但遗后来人乘凉。

二进制安全概述

这一篇是总篇,我大致梳理二进制安全的学习路线,优良的学习资源并赋予自身的一些浅显理解。此后的每篇博文都会详细记载每一门技艺的细节,且对于必要的颇有难度的部分会配制我个人录制的视频教程,视频教程相对博文来说,会更为的细心琐碎却难能易懂。这主要是给那些本钱平平,想入门二进制安全而卡在瓶颈的道友打开一扇门(如果你时常觉得自身基础尚可,但每每赏阅师傅们的writeup时,总存在着诸多疑处悬而未决,那么我强烈推荐你上车)。着重强调的是,二进制安全的范畴非常广泛,这一系列的文章仅仅是着力于漏洞相关的方向。

必备基础

对于学习二进制安全来说,从来都不会有零基础教学,与不可能存在零基础的教学(如果你在网上找到,那一定是骗子无疑)。二进制安全本身是门槛较高的一门技艺,它需要相当的前置基础,而基础的优劣往往又决定了此后学习的难易程度、达成成就的深度和广度。所以,学习路上的第一步就是夯实基础,我会列出必备的基石,烦请各位按图索骥,早日拿票上车。

语言基础必备

  • 精通C语言
  • 熟悉x86汇编,且有一定的反汇编基础
  • 熟悉Python,Ruby

Windows平台

  • 熟悉Windows SDK/WDK编程
  • 熟悉Windows PE格式
  • 熟悉Windows系统的组成、基本原理

Linux平台

  • 熟练使用Linux操作系统
  • 熟悉Linux系统/内核编程
  • 熟悉Linux ELF格式
  • 熟悉Linux系统的组成、基本原理

以上仅是针对流行的Windows以及Linux平台,对于Mac OS以及各移动端由于条件以及精力的问题,我尚无研究,如果以后有机会,会做补充。

对于这些基础的内容,我不会也不大可能全部的枚举讲解甚至推出视频教程,但是我可以安利一些我读过看过逛过的优质书与网站:

C语言

这个老生常谈了,玩二进制安全不可能不懂C。最简单的道理,Linux和Windows都是C写的,提供出来的系统库也是C函数接口最为直接,不会C的二进制白帽子就像是不会游泳的海盗。

书籍:

  • 《C程序设计语言》
    • 注意是大名鼎鼎的K&R,不是通篇谬论的谭某强
  • 《C和指针》
    • 神作,你离精通只有这本书的距离

网站:

汇编

汇编是个广义的概念,我们目前用到最多的还是Intel x86汇编,你可能需要懂一些8086、x64或者ARM,mips等汇编。此外,反汇编是个需要通过练习并适应的技术,可以说是二进制安全的命门。

书籍:

  • 《汇编语言》
    • 如果你刚入门,且想要每一步都走得踏实,那么请从8086汇编开始学习,这本书无疑是最优秀的。
  • 《琢石成器:Windows 32位汇编语言程序设计》
    • 老罗的神作,这本书实际上讲的是WinSDK编程,只不过用的masm32。
  • 《C++反汇编与逆向分析技术揭秘》
    • 带你步入反汇编的大门

网站:

  • 对于汇编,大多数时候你只是google一个指令。
  • http://bbs.pediy.com
    • 看雪学院,妇孺皆知。

python/ruby

对于帽子来说,Python无疑是当前最受宠的语言,其语法干练,标准库强大,人生苦短,我用python。而Ruby和Python类似,对于帽子们来说,有个很重要的框架叫metasploit,集成了历年exp的神器,这货是ruby写的,所以你懂的。

书籍:

  • 《Python核心编程》
    • python是个双枪,v2/v3傻傻分分不清楚,这本书的第二版和第三版分别是v2和v3。实际上我只读过第二版,且仅仅读过一部分章节(基本和knownsec划的重点一致)。

网站:

其他

书籍:

  • 《Windows PE权威指南》
    • 玩Windows,你敢不懂PE?
  • 《加密与解密》
    • 了解二进制安全的“科普读物”(掌门不要打我)
  • 《Windows程序设计》
    • Windows编程圣经,不言而喻。
  • 《Windows核心编程》
    • 从内核的高度来讲解应用层面的技术细节,我读过的Windows编程相关最好的一本。
  • 《Windows内核安全编程》
    • 楚狂人的书,这是最新版的,汇集了早先的《寒江独钓》和《天书夜读》。
  • 《Windows驱动开发技术》
    • 如果你直接啃楚狂人比较吃力,先看这本入门。都是讲WDK编程。
  • 《Windows内核原理与实现》
    • 潘爱民老师的书都值得一读,这本书让你深入理解Windows系统底层的运作方式。
  • 《Unix高级编程》
    • 基本可以片面的理解成Linux系统编程(POSIX标准)
  • 《Linux设备驱动程序》
    • 关于linux驱动的那些事儿
  • 《深入理解Linux内核》
    • Linux开放源码的好处就是,了无秘密。
  • 《程序员的自我修养:装载、链接与库》
    • 神作,作为一个未来的二进制帽子,你应该对一个可执行程序的前世今生烂熟于胸。

网站:

学习路线

步入二进制的大门

OK,你已经具备了上面的大部分的基础,我们来研究一下二进制安全的学习。对于国内来说,二进制安全最好的社区无疑是看雪论坛,卧虎藏龙的看雪也确实出品了相当一部分优质的资源,而对于新手来说,最适合的一本教科书恰恰源于看雪论坛的failwest之手,那就是《0day安全:软件漏洞分析技术》:

这本书虽然比较旧了,其中所用系统围绕着server 2000, XP, XP SP3, server 2003展开,对于较新的Win7/8/10自然是没有所涉及。然而,对于掌握基本功来说,里面的任何知识都是不会过时的。无论版本如何变迁,根本上的思想,对于技术细节的把握,和这本书所传授的知识如出一辙。可以说,failwest的这本书绝对称得上是二进制入门的教科书,真正意义上的授人以渔。

这本书的pdf在csdn上不难找到,如果实在资源难觅,可以私信我。如果有可能,推荐大家买一本实体书支持一下failwest师傅(现在可能到处都售罄)。也正是五年前我拿到这本书,还有看雪掌门人的《加密与解密》,不舍昼夜,醉心于此,页页充满震撼。

安利了书后,我们大致捋一下其中的内容,对于见习门徒来说,最为基础的无非就是需要掌握以下的知识:

  1. Windows基础知识,SEH机制,堆结构
  2. 栈溢出漏洞
  3. 堆溢出漏洞
  4. shellcode与metasploit
  5. 格式化串漏洞
  6. Windows的高级保护机制:GS,SafeSEH,DEP,ASLR等
  7. 简单的漏洞挖掘
  8. 内核漏洞的调试与分析

当然,这本书涉猎甚广,甚至踏足了web安全的领域以及早期的工控,移动端的安全,这跟当时安全圈的环境有关。另一方面,虽然这本书甚为全面,但是除却对基础的知识有着充分的讲解外,很多高级的内容都只是浅尝辄止,诚然,这也超出了这本书的定位。

如果按当下来看,0day这本无疑算是上古时期的作品,此后的游戏环境有了大幅度的改变。后来人的不断研究,行业的重视程度提高,使得二进制安全也越来越成体系。此后的看雪学院,又有了一位惊才绝艳的高手问世——riusksk。帽子们往往会亲切的称呼他为林大夫或泉哥,一个曾经在阿里工作的“骨科医生”,大名林桠泉。riusksk是他在看雪的id,虽然近些年已不见泉哥活动的踪迹,但依然留下了很多泽披后世的好文。

泉哥曾于15年出版了写作数年方毕的二进制安全好书——《漏洞战争》,这本书因为难度较大,我们后面再论。除此书之外,或许在业内知名度更高的应该是泉哥翻译的Exploit编写系列教程。这是国外的一个著名帽子为初学者所写,实际上内容和failwest的0day差不多,只是更为精练。可惜的是,作者仅仅写了栈溢出的相关内容,对于一些其他类型的漏洞,比如堆溢出,按照作者的说法,因为其复杂度较高,不是简单的几篇文章就能涵盖的,于是也就没了下文。

Exploit编写系列教程专题

值得一提的是,作者的exp用的是perl,但是你仅仅需要了解基本的perl语法即可。

此后,版本更迭,更多优秀的新作品问世。蛙师傅和安于此生师傅翻译了两个非常优秀的Exploit编写系列文章:

而除了Windows平台,看雪的飞龙使者也翻译了Linux下的Exploit(SploitFun)系列:

疯狂的训练

如果你掌握了上面所有最重要最基础的技能,那么下一步无疑就是进入疯狂的训练期。训练需要有素材,别担心,我们有源源不断的素材进贡。

如果是刚刚出道,那么在没有师傅帮助的情况下,独立通过已有的exp看懂一个漏洞的利用,甚至独立完成某个漏洞的exp,是十分苦难的。此时可以通过遍寻优质的exploit writeup来临摹学习。关于模具,可以到各安全网站,师傅们的博客上寻找,我大概列出一些:

师傅们的博客

实际上师傅们远不止此,我只是抽出了几个我常去的站点,友情提示,可以通过师傅们的友链自行扩展。

站点

github上也有很多writeup,而且除了CVE,你还可以去找找各大公司的SRC,以及CTF赛事pwn相关,reverse题也是值得推荐的。在此,我就不一一枚举了,毕竟hack endless.

初学者可以找一些漏洞靶场,CTF靶场来做特化训练,比如Windows内核漏洞是一个坎,入门时可以用HEVD试试。

最后,我们补充此前提到的泉哥的《漏洞战争》:

这本书收录了诸多的CVE分析,且大部分的案例都十分经典,风格迥异而又具有较高的难度。强烈推荐买一本支持泉哥。

最后的最后,还是那句老话,师父领进门,修行在个人。