二进制安全概述
浸淫二进制已久,几年来学习途径上也颇为坎坷,每每苦于没有一套完整的纲要,尤在入门开荒期间,上下而求索。一直以来都想自己规划出一套二进制安全系列的教纲,从上古时期到现代的技术细节,汇集整理所学所想,承百家之技艺,但遗后来人乘凉。
二进制安全概述
这一篇是总篇,我大致梳理二进制安全的学习路线,优良的学习资源并赋予自身的一些浅显理解。此后的每篇博文都会详细记载每一门技艺的细节,且对于必要的颇有难度的部分会配制我个人录制的视频教程,视频教程相对博文来说,会更为的细心琐碎却难能易懂。这主要是给那些本钱平平,想入门二进制安全而卡在瓶颈的道友打开一扇门(如果你时常觉得自身基础尚可,但每每赏阅师傅们的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和指针》
- 神作,你离精通只有这本书的距离
网站:
- http://www.fishc.com/
- 鱼哥的教程很适合初学者,免费、良心、精致
- https://pan.baidu.com/s/1qXE0CzE 密码:58ue
- 我个人15年录的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划的重点一致)。
网站:
- https://docs.python.org/2/
- 余弦曾经说过,我没读过Python的任何一本书,但通读过官方手册。我目前在翻译python2.7.13的标准库,你在我的博客中python tag下可以轻易的看到。
- https://docs.python.org/3/
- python 3文档
- https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
- 廖雪峰老师的python教程,值得一提的是,他的git和js教程也不错,值得一看。
- http://www.runoob.com/ruby/ruby-tutorial.html
- runoob的ruby简单语法梳理,你不需要多么精通某种语言,但是最起码要过一遍,不然视野会局限。
其他
书籍:
- 《Windows PE权威指南》
- 玩Windows,你敢不懂PE?
- 《加密与解密》
- 了解二进制安全的“科普读物”(掌门不要打我)
- 《Windows程序设计》
- Windows编程圣经,不言而喻。
- 《Windows核心编程》
- 从内核的高度来讲解应用层面的技术细节,我读过的Windows编程相关最好的一本。
- 《Windows内核安全编程》
- 楚狂人的书,这是最新版的,汇集了早先的《寒江独钓》和《天书夜读》。
- 《Windows驱动开发技术》
- 如果你直接啃楚狂人比较吃力,先看这本入门。都是讲WDK编程。
- 《Windows内核原理与实现》
- 潘爱民老师的书都值得一读,这本书让你深入理解Windows系统底层的运作方式。
- 《Unix高级编程》
- 基本可以片面的理解成Linux系统编程(POSIX标准)
- 《Linux设备驱动程序》
- 关于linux驱动的那些事儿
- 《深入理解Linux内核》
- Linux开放源码的好处就是,了无秘密。
- 《程序员的自我修养:装载、链接与库》
- 神作,作为一个未来的二进制帽子,你应该对一个可执行程序的前世今生烂熟于胸。
网站:
- https://github
- 这个不用我介绍了吧。
- https://stackoverflow.com/
- 听说你遇到了问题百度不到答案?
- http://www.linuxidc.com/
- 每次看这个网站的UI都觉着滥竽充数,但确实不乏高质量文。
- http://cn.linux.vbird.org/
- 鸟哥本来是出了书的,但是我觉着对于linux的学习使用,在website上刷更为好用。
学习路线
步入二进制的大门
OK,你已经具备了上面的大部分的基础,我们来研究一下二进制安全的学习。对于国内来说,二进制安全最好的社区无疑是看雪论坛,卧虎藏龙的看雪也确实出品了相当一部分优质的资源,而对于新手来说,最适合的一本教科书恰恰源于看雪论坛的failwest之手,那就是《0day安全:软件漏洞分析技术》:
这本书虽然比较旧了,其中所用系统围绕着server 2000, XP, XP SP3, server 2003展开,对于较新的Win7/8/10自然是没有所涉及。然而,对于掌握基本功来说,里面的任何知识都是不会过时的。无论版本如何变迁,根本上的思想,对于技术细节的把握,和这本书所传授的知识如出一辙。可以说,failwest的这本书绝对称得上是二进制入门的教科书,真正意义上的授人以渔。
这本书的pdf在csdn上不难找到,如果实在资源难觅,可以私信我。如果有可能,推荐大家买一本实体书支持一下failwest师傅(现在可能到处都售罄)。也正是五年前我拿到这本书,还有看雪掌门人的《加密与解密》,不舍昼夜,醉心于此,页页充满震撼。
安利了书后,我们大致捋一下其中的内容,对于见习门徒来说,最为基础的无非就是需要掌握以下的知识:
- Windows基础知识,SEH机制,堆结构
- 栈溢出漏洞
- 堆溢出漏洞
- shellcode与metasploit
- 格式化串漏洞
- Windows的高级保护机制:GS,SafeSEH,DEP,ASLR等
- 简单的漏洞挖掘
- 内核漏洞的调试与分析
当然,这本书涉猎甚广,甚至踏足了web安全的领域以及早期的工控,移动端的安全,这跟当时安全圈的环境有关。另一方面,虽然这本书甚为全面,但是除却对基础的知识有着充分的讲解外,很多高级的内容都只是浅尝辄止,诚然,这也超出了这本书的定位。
如果按当下来看,0day这本无疑算是上古时期的作品,此后的游戏环境有了大幅度的改变。后来人的不断研究,行业的重视程度提高,使得二进制安全也越来越成体系。此后的看雪学院,又有了一位惊才绝艳的高手问世——riusksk。帽子们往往会亲切的称呼他为林大夫或泉哥,一个曾经在阿里工作的“骨科医生”,大名林桠泉。riusksk是他在看雪的id,虽然近些年已不见泉哥活动的踪迹,但依然留下了很多泽披后世的好文。
泉哥曾于15年出版了写作数年方毕的二进制安全好书——《漏洞战争》,这本书因为难度较大,我们后面再论。除此书之外,或许在业内知名度更高的应该是泉哥翻译的Exploit编写系列教程。这是国外的一个著名帽子为初学者所写,实际上内容和failwest的0day差不多,只是更为精练。可惜的是,作者仅仅写了栈溢出的相关内容,对于一些其他类型的漏洞,比如堆溢出,按照作者的说法,因为其复杂度较高,不是简单的几篇文章就能涵盖的,于是也就没了下文。
Exploit编写系列教程专题
值得一提的是,作者的exp用的是perl,但是你仅仅需要了解基本的perl语法即可。
此后,版本更迭,更多优秀的新作品问世。蛙师傅和安于此生师傅翻译了两个非常优秀的Exploit编写系列文章:
- http://bbs.pediy.com/thread-207969.htm
- 安于此生师傅翻译的大名鼎鼎的Corelan Team的现代Exploit教程,这个组织非常出名,Immunity Debugger和mona.py两大神器尽出于此。
- https://www.corelan.be/index.php/articles/
- 我觉着我应该把他们的站点给你
- http://bbs.pediy.com/thread-206857.htm
- 蛙师傅翻译的另一系列Windows Exploit编写教程,这一系列原理描述较少,更偏于实战。
- http://expdev-kiuhnm.rhcloud.com/2015/05/11/contents/
- 你还可以在他们的网站上找到更多有趣的东西。
而除了Windows平台,看雪的飞龙使者也翻译了Linux下的Exploit(SploitFun)系列:
疯狂的训练
如果你掌握了上面所有最重要最基础的技能,那么下一步无疑就是进入疯狂的训练期。训练需要有素材,别担心,我们有源源不断的素材进贡。
如果是刚刚出道,那么在没有师傅帮助的情况下,独立通过已有的exp看懂一个漏洞的利用,甚至独立完成某个漏洞的exp,是十分苦难的。此时可以通过遍寻优质的exploit writeup来临摹学习。关于模具,可以到各安全网站,师傅们的博客上寻找,我大概列出一些:
师傅们的博客
- https://www.hackfun.org/
- 4ido10n师傅,CTF狂魔
- http://o0xmuhe.me/
- muhe师傅
- http://bestwing.me/
- swing师傅
- http://yixuankeer.win/
- 前端大佬joker师傅
- http://whereisk0shl.top/
- k0师傅
- k0师傅在i春秋还有个很优秀的免费二进制漏洞视频教程
- http://www.hackersb.cn/
- 漏洞盒子创始人,王松师傅
- http://www.cnblogs.com/iamstudy
- Syclover大牛 柠檬师傅
实际上师傅们远不止此,我只是抽出了几个我常去的站点,友情提示,可以通过师傅们的友链自行扩展。
站点
- http://www.fuzzysecurity.com/exploits.html
- fuzzysercurity上有很多writeup
- https://www.exploit-db.com/
- exploit-database,刷CVE的好地方
- https://www.seebug.org/
- knownsec的Seebug,其实knownsec更偏于Web安全
- http://bobao.360.cn/
- 数字公司的门面
- http://www.freebuf.com/
- freebuf的UI很漂亮
- http://www.anquan.us/
- wooyun知识库/公开漏洞
- 与其听信谣言,不如相信乌云:)
github上也有很多writeup,而且除了CVE,你还可以去找找各大公司的SRC,以及CTF赛事pwn相关,reverse题也是值得推荐的。在此,我就不一一枚举了,毕竟hack endless.
初学者可以找一些漏洞靶场,CTF靶场来做特化训练,比如Windows内核漏洞是一个坎,入门时可以用HEVD试试。
最后,我们补充此前提到的泉哥的《漏洞战争》:
这本书收录了诸多的CVE分析,且大部分的案例都十分经典,风格迥异而又具有较高的难度。强烈推荐买一本支持泉哥。
最后的最后,还是那句老话,师父领进门,修行在个人。