在漏洞的汇编代码,指出漏洞形成的原因,即给出“结论式分析”,却并不解释如何定位到此段代码,看完之后,仍不知如何快速定位,缺乏可借鉴的思路。带着这些问题,相信读者会在本书中找到想要的答案。
本书的写作始于2012年5月,最初是网友“爱无言”向我提议合写一本关于软件漏洞案例分析的著作——因为当时我在博客上每周都会分享一两篇软件漏洞分析的实际案例,而当时国内还没有专门针对软件漏洞案例的专著(《0Day安全:软件漏洞分析技术》主要偏向堆栈溢出及内核方面的漏洞分析,实际案例较少,且“爱无言”也是该书作者之一)——于是,我们一拍即合,写书的念头就此产生。后来,我又拉了两位朋友加入,共同列出了大纲。然而种种原因,最后只剩下我独自完成本书的创作,中途也曾多次想放弃。直到某一天,编辑皎子找我聊了一些出书的想法,就这样,一本原打算沉埋箱底的“残卷”再次被“激活”,而一本原为“合著”的书就成了“专著”。好在“激活”之后的写书经历还算顺利,从开始动笔到出版上市,前后历时4年。图书质量和出版后的效果也比较符合预期,埋藏心底多年的“结”总算可以打开了。
相信一些读者看到本书目录后会有一些疑问,我也相信其中一些疑问也是当时我在定位本书方向时曾考虑过的,所以有必要在此谈一谈。
Q:本书与《0day 安全:软件漏洞分析技术》有何区别?
A:《0day安全:软件漏洞分析技术》一书主要阐述Windows平台下堆栈溢出和内核提权的漏洞分析技术,同时涉及部分格式化字符串漏洞,从基础讲起,最后是实例分析。本书则完全以真实的漏洞为实例,并根据不同的漏洞类型来分享漏洞分析的不同技巧,可以说是“用调试器写出来的一本书”,而且综合考虑了当前热门的移动安全技术,特意加入Android平台上的漏洞分析章节,从Java层、Native层和内核层等方向分享不同的调试分析方法。从难度而言,本书比《0day安全:软件漏洞分析技术》一书更难,读者朋友可以将本书当成进阶版,搭配学习。
Q:本书列举的许多漏洞实例网上早有分析文章,为何还写这本书?
A:著书的宗旨在于“授人以鱼,不如授人以渔”。如果读者经常看网上的漏洞分析文章,就会发现一个常见现象:它们大多是“结论性分析”,而非“思路性分析”。换句话说,就是贴出存在漏洞的汇编代码,然后直接给出漏洞成因的结论,至于如何定位到漏洞代码,并没有给出分析思路。正因为如此,即使你看懂了Vupen漏洞军火商写的分析文章,也不代表你看完后就能独立分析出来,甚至在调试之后,你还会发现Vupen会在一些文章中留“坑”,故意省略或写错某些关键内容,如果自己没有实际调试一遍是很难发现这些问题的。
相信有一定软件漏洞分析经验的朋友会注意到,软件漏洞分析的大部分时间花费在寻找和定位漏洞代码上,而非分析存在漏洞的代码。对于有一定编程经验和漏洞基础的读者,如果直接给出一段漏洞代码,他们可能很容易就能看出来;但如果是像Adobe和Windows这样复杂的软件或系统,分析人员要在千千万万的代码行中找出漏洞代码是有一定难度的。因此,本书的重点是讲授如何快速地定位漏洞代码,针对不同漏洞类型采取不同的分析技巧,以帮助大家快速地分析出漏洞成因,制定检测、防御与修复方案。书中的漏洞实例分析技巧是可以长期运用和延伸的,这才是本书的核心价值。
Q:如何借助本书提升自身的软件漏洞分析能力?
A:本书主要面向有一定软件漏洞分析基础的读者。如果读者缺乏这方面的基础,但有一定的C语言和汇编语言的基础,则建议提前阅读《0day安全:软件漏洞分析技术》一书。软件漏洞分析是实践性较强的技术工作,需要许多实际动手的调试经验,因此建议大家在阅读本书的同时,自己手动调试,以加深理解。这就像骑自行车一样,在熟练之后,哪怕十年未碰车,也依然能上手。本书在分析漏洞时,也尽量以思路性的描述为主,侧重讲解分析漏洞时的思考方式和常用技巧,包括工具和方法论,因此大家在阅读时,应该掌握书中介绍的思考方式、工具运用及分析技巧,毕竟某个漏洞案例本身是会过时的,但技巧性的东西总是可以借鉴和扩展的。
记得大一上第一节历史课时,老师说过这样一句话,如果在未来的某一天,你在和朋友闲聊时,能够运用到历史课上学到的知识,哪怕只是用到一句话作为谈资,那这节历史课就算没白学。同样地,我也希望未来大家在分析软件漏洞时,本书能够提供一些帮助,哪怕是一个分析技巧,一个工具使用,我也觉得这4年的付出相当值了。
近年来,各种APT攻击事件频发,一些知名企业,甚至国家级单位都曾遭受到漏洞攻击。每年都有一款产品的漏洞被频繁用于网络攻击,比如,2012年的Office漏洞(还记得经典的CVE-2012-0158吗),2013年的Java漏洞,2014年的Internet Explorer漏洞,2015年的Adobe Flash漏洞。PC端上的软件漏洞则一直在逐年增加,虽然厂商不断推出各种安全机制,但漏洞利用技术自身的发展也从未间断,Exploiters依然生存得很好。同时,互联网早已步入移动化时代,伴随着PC软件漏洞攻击事件的频发,移动端的漏洞攻击也在逐年增长。因此,笔者结合PC端(Windows)与移动端(Android)平台上的漏洞案例,将自身的实战经验整理成本书。
求学之路
经常有人问我:“一个医学生为什么会转行做安全?”通常我都会这么回答:“因为小说看多了。”
大一时,由于喜欢看黑客小说,比如,《黑客传说》《地狱黑客》《指间的黑客》,我就去图书馆找一些黑客书籍来自学,每天中午都不休息,几乎天天泡在图书馆看书,甚至“翘课”去看计算机专业的书。
一直到大四我才终于买了计算机,在此之前都只能去网吧、学校机房或者借用舍友的计算机。
当年,我就用诺基亚3100手机看完了《Windows程序设计》《Windows核心编程》和《Windows环境下32位汇编语言程序设计》;再后来就网购图书——这比在网吧看电子书更实惠。
大学期间,我还经常给《黑客防线》杂志投稿,一方面可以提升个人技术水平,另一方面还可以用稿费作为生活补贴。后来我也是用稿费再加上哥哥的支持,买了人生中第一台属于自己的计算机,本书就有一半内容是在这台计算机上完成的。
在求学这条道路上,我一直是一个人默默地前行着,就连一块生活了几年的舍友也不知道我在学习安全方面的知识,我买的一堆计算机专业的图书一直被藏在宿舍衣柜的最里面。在此过程中,自己走过很多弯路,甚至差点放弃,但很庆幸最后还是坚持下来了。直至今日,我依然在安全这条道路上前行着……
面试经历
在圈内朋友的建议下,我在大五(医学五年制)上学期开始寻找信息安全相关的工作,最终顺利拿到安恒和腾讯的offer。当初投简历给安恒时,安恒的副总裁看完我的简历后直接发了offer,我有点受宠若惊,也特别感谢安恒的信任,但最终还是选择了腾讯。面试腾讯的经历,我觉得是个有趣的过程,值得与大家分享。
那年我还在厦门市第二医院骨伤科实习,门诊部刚好不是特别忙,我给一位腰椎患者做完针灸后,就接到来自腾讯安全中心的面试电话。趁主任不在,我偷偷躲到门诊部后面的楼梯口进行电话面试,整个面试过程还算比较顺利,第二天腾讯安全中心就来电说希望我到深圳总部面试。
到了深圳总部后,腾讯安全中心的主管面试了我,虽然聊了一个半小时,但没有问太多问题,聊完后我就被直接带到HR那里面试。HR面试时,我们的开场并非常规的话题,而是腰椎间盘突出!这也算是一次别开生面的面试经历吧。
回到厦门后,我向带教老师说明了转行情况,之后有上手术台的机会,我都会主动让给其他同班同学,让他们有更多上台练手的机会,而我自己自然有更多的时间去钻研安全技术。
加入腾讯
腾讯是我的第一家雇主,也是目前我唯一工作过的公司,从我毕业一直工作到现在。我见证了腾讯安全应急响应中心(TSRC)的成立与发展,并帮助完善了各种流程和标准。作为早期主要的漏洞审核者,我也从广大白帽子身上学到很多东西,包括各种漏洞挖掘与利用技术,涉及各个安全领域,如Web安全、驱动安全、应用软件安全、移动安全等。正是TSRC给了我更多学习的机会,使我在安全技术上能够更加全面地发展。除此之外,我在公司也从事一些安全研究工作,研发出Android与iOS应用安全审计系统,现已投入公司日常运营中。
至今,我依然觉得能够将工作与兴趣结合在一起,是一件既幸福又幸运的事,而选择腾讯依然是我当年的明智之举。