二进制安全学习路线(转)
本文转自:https://blog.csdn.net/weixin_43415644/article/details/99618192###
大牛说的话,我喜欢就挪过来了;希望作者不要介意;
本文作者:rkvir(二进制小组组长)
转自某推文,链接找不到了。
一.
什么是二进制安全
在很久以前安全圈并没有把安全技术做出一个特别清晰的分类。在大部分人眼里,所谓的黑客,安全研究者指的就是研究渗透入侵一类的技术的从业者,并不知道什么是逆向工程或者说二进制安全。提起逆向工程也许还有人可以联想到软件破解,如果提起的是二进制安全,那么知道的人就真的是寥寥无几了。实际上二进制安全技术在20世纪90年代就已经有了一小群先驱者在研究。时至今日二进制安全以及发展出了完整清晰的体系,并且有大量的爱好者希望学习这门技术。虽然市面上已经有了许多的经典书籍可以让二进制安全爱好者们来学习。但是似乎没有人提出一条清晰有效的学习路线,避免初学者误入歧途。这也就是这篇文章诞生的目的。本文可能没有那么多的“技术干货”。只是为了给初学者明确为什么要学习Windows下的二进制安全,学习之后可以做些什么,又到底应该如何学习,从基础到深入,都应该做些什么。
二. 为什么学习,学习后可以做些什么?
首先提出一个问题,不知道大家有没有碰到过在写代码中遇到过以下这样的问题:
- 明明看起来代码写的毫无问题,但是却在main函数之前就已经报错。
- 碰到一款好的软件,但是广告太烦无法关闭。
- 你想知道一款软件的功能是如何实现的,却苦于没有源代码。
- 软件出现崩溃,想要找到原因却无从下手。
- 电脑中了病毒,杀毒软件却无法查杀。
- 刚刚发布的产品,马上就被人破解了。上面只是提出一部分常见的问题。在学习二进制安全后你可以这样解决以上的问题。
(1). 因为二进制安全需要深入理解计算机的运行机制,操作系统原理。所以碰到此类问题,你可以很快定位到错误位置,为你的编码工作提供强有力的支撑。
(2). 碰到这类软件的时候,你可以通过逆向工程的方式,将其中的广告页面替换,甚至直接将弹出广告的函数直接ret或用nop填充掉。还给自己一个清静没有广告的办公环境。
(3). 当你想知道这个功能如何实现的时候,你既可以静态分析其函数的实现逻辑,也可以动态跟踪它的数据流向,从而完整了解该功能是如何实现的。
(4). 当软件崩溃是不是无从下手,但是学了二进制安全之后你可以使用调试器接管异常,去发掘漏洞产生的位置,定位到模块或者函数的某一条语句。然后提供给厂商修复或者自己二次开发使用补丁修复漏洞。
(5). 当中了杀软无法识别的病毒是不是很恐慌,学习了二进制安全后就可以直接手动分析病毒做了些什么,并且将其执行的操作逆转,拯救中毒的计算机操作系统。
(6). 刚刚发布的软件马上就被别人破解了,没有收入了。是不是很郁闷,当学习了二进制安全后,你可以对你的软件加混淆、加花指令、加反调试、加代码虚拟化等等手段,让破解者的破解成本增加到无法承受,从而放弃破解。
三. 学习后可以从事什么样的职业上面说的都是日常中的问题,那么如果我们要走专业路线,我们有什么样的职业可以选择呢,下面我们来详细了解一下。
逆向工程师大部分的逆向工程师都是在进行竞品分析,所谓的竞品分析就是分析同行的软件,看看有什么东西是比自己好的,加到自己的产品中。还有一部分逆向工程师是配合研发工程师进行项目攻关,解决疑难问题的。
恶意代码分析工程师恶意代码分析工程师也可以成为病毒分析师,主要服务于乙方安全公司、各大监管单位以及政府部门。负责对病毒进行快速分析或详细分析。目的主要是发报告为单位获取知名度或者为自家单位的恶意代码引擎提供规则。近年来有一种新的概念叫APT,是类似于特工情报组织所研发出针对指定敏感行业,例如能源化工,亦或者政府机关的攻击载体。特点是长期潜伏,密集踩点。对目标系统内部极为了解,有针对性的窃取情报。有部分恶意代码分析工程师就是负责追踪此类组织的攻击轨迹,分析同源性等相关工作
漏洞分析工程师漏洞分析工程师主要负责针对已有漏洞进行分析,并且产出报告或者规则。职业权能与恶意代码分析工程师类似,但是更专注于漏洞类型的样本分析。不过近年来恶意代码也多带有漏洞传播。例如大名鼎鼎的永恒之蓝漏洞,就催生出了一大批勒索软件。所以如今的漏洞分析工程师,也多兼任恶意代码分析工程师的职能。
漏洞挖掘工程师漏洞挖掘工程师与漏洞分析工程师的不同之处在于漏洞挖掘工程师的主要工作内容为通过模糊测试等手段对软件、驱动或操作系统进行未知的漏洞发掘工作。此类工程师有可能是对自家产品进行检测,负责的是模拟攻击者对产品的安全性进行检测。也有可能是对第三方厂商进行漏洞挖掘,并且将漏洞提交给厂商或SRC等平台。目的可能是提升企业知名度也可能是满足监管单位对其的要求。
游戏安全工程师游戏安全工程师也称为反外挂工程师,顾名思义就是与游戏外挂做对抗的专业人士。目前大部分的反外挂手段都集中在R0层,也就是使用驱动作为对抗手段。因为R3层的反调试手段已经很难阻止越来越猖獗的外挂作者了。并且现如今的外挂作者也由最初的业余玩家变成了如今的专业人士。导致外挂与反外挂的对抗手段越来越趋近底层,据我所知目前外挂作者中的顶级高手已经在VT层进行反反外挂工作了。利用虚拟化手段重建调试体系。所以游戏安全工程师的任务依然很艰巨。
安全研发工程师安全研发工程师主要集中在各大乙方单位,例如负责杀软、恶意代码检测引擎、沙箱、蜜罐、扫描器、调试器等安全工具或安全产品的开发工作的研发人员。都是安全研发工程师。此类工程师一般多为具有安全背景的研发者,区别于普通研发者的地方在于他们更加了解安全,可以实现一切特殊的功能以满足安全产品的需要。
四. 如何学习二进制安全
上面我们已经讨论过了为什么要学,学了可以做什么。学完可以从事什么样的职业。那么接下来我们要讨论的就是如何学习。当初学者兴致勃勃的准备开始学习的时候会发现,虽然书籍众多,却无从下手。一个不小心还会误入歧途,成为一个只懂得是什么,却不懂得为什么的庸人。接下来我们要做的就是,缕清这条线,让其清晰明了。
首先,我们作为二进制研发人员必须要懂的语言有三门半,为什么说是三门半呢,因为这四门语言是C、C++、Python以及汇编。C和C++属于一脉相承因此只算一门半语言,因为这两门语言的学习是连续的,不需要像学习Python或汇编一样重新学习语法结构。那么接下来我来说明一下为什么要学习这三门半语言。首先是C和C++,先不说开发杀毒引擎或者其他大型工程,仅仅有一点最为实际。那就是IDA pro所翻译出的伪代码是C语言格式的。另外在以后漏洞的学习中,除了汇编语言,C和C++是开发shellcode最为高效的语言。而且相比于汇编也更容易理解。并且也许我们想招写一些具有特殊功能的小玩意,比如远(病)控(毒)软(木)件(马),C和C++也一定是你最优秀的选择。或者我们需要写一些驱动代码,比如实现一个类似于火绒剑的监控软件,毕竟,你总不能去用易语言开发吧。现在的系统也不兼容啊对不对。
那么介绍完C和C++的用处,接下来说明下Python的作用。其实Python就像是一个万能胶水,哪里有用粘哪里。它可以辅助我们快捷的开发一些辅助分析工具或者Exploit。也可以充当解放双手释放劳动力解决重复操作的机器人。总之,Python除了性能感人,其他都不会让你失望的。最后说明一下汇编语言的作用。其实这是最不用解释的了。毕竟,动态分析中没有任何一款工具可以把代码还原成伪代码执行,我们分析过程中所接触的全都是汇编代码。
上面扯了一大段为什么要学习这些语言,那么下面来说明下如何学习这些语言。其实很简单,就是看书。当然如果觉得乏味,靠谱的教学视频也是可以的。
C语言有很多本书可以选择,但是我只推荐一本,避免选择困难。这本书叫做《C Primer Plus》,这本书的作者叫Stephen Prata,目前这本书已经翻译成中文版了,可以直接在网上购买。这本书详尽的说明了C语言语法你所需要了解的一切。推荐花30天时间简单学习,然后就开始学习C++。C++的学习我推荐使用《C++ Primer》作为教材。推荐学习时间依然是30天。
你以为我会让你接下来直接开始学Python?你太天真了。
C和C++在简单看完这两本书的情况,你只是知道,却不会使用。这时候你最需要的就是练习了。如果以前数学学的还不错,那就搞本《算法导论》,练习里面的算法与数据结构。如果基础差一点,就买一本国内出版的零基础学算法一类的书练习里面的例子。这个阶段我的推荐学习时长为60天。对,你没看错,和学习语法的时间一样长。
当你练习了这么久之后,就可以继续学习语言了。没错,终于到Python了,买本《Python核心编程》吧。你已经有了不错的基础,相信我,一周之内看完这本书你没问题的。不需要你记住所有库的 使用,Python的库实在太多了,你只需要记住大概有个什么库可以解决相关问题,需要的时候再去网上查就好了。
最后是我们的汇编语言,最艰苦的日子到了,这是个很难学的东西。我学习的时候也感觉头冷,但是很不幸,这是一门必要的语言。
汇编语言我推荐使用《汇编语言 基于x86处理器》这本书来学习。也许很多人都是学习的王爽老师的那本《汇编语言》入门的。我是我还是想推荐这本,因为这本书是我见过最容易理解的汇编语言教材。至此,语言阶段结束。 当我们学习完语言基础之后,我们需要学习的就是系统编程了,这个阶段我们只需要看两本书,但是别高兴的太早,因为这两本书都是大部头,好在我们不是专业开发人员,所以不需要看的那么细致。
第一本《Windows程序设计》,这一本主要讲解的是GUI编程。我们也就是写写安全工具,所以简单看看就行。但是一些以后可能会发现一些奇淫技巧,比如界面藏私钥这种操作。遇到了在了解就行。第二本是《Windows核心编程》,这本书主要讲的是Win32 API编程,需要好好了解一下,因为Windows下的恶意代码一类的,万变不离其宗,最后还是要走API这条路。
这个阶段的推荐学习时间是90天。学习完系统编程,我们要学习的是Windows下的文件结构,也就是PE(Portable Executable)结构,这个结构对于我们分析病毒还是漏洞都有着至关重要的作用,因此需要详细了解,讲解这个结构的书非常多,
我推荐使用《Windows PE权威指南》,这样既学习了PE结构,又复习了汇编语言。推荐时长30天。学习了这么多基础,铺垫了这么久。我们终于要开始学逆向了。软件逆向我依然只推荐一本书《c++反汇编与逆向分析技术揭秘》,软件逆向看这一本书就够了,但是看完之后建议看一些综合类的实战书籍,比如《加密与解密4》,然后我们还需要对Windows的调试原理有些了解,这里使用《Windows高级调试》以及《软件调试》来学习。
推荐学习时长90天
。
最后我们要选择的就是细分领域了,当然,也可以全学。
恶意代码分析我推荐《恶意代码分析实战》,
漏洞分析我推荐《0day安全:软件漏洞分析技术》入门,
《漏洞战争》进阶。《shellcoder编程揭秘》来了解漏洞利用中的奇淫技巧。很不幸的是,我还没有发现一本值得推荐漏洞挖掘的书籍。此阶段建议学习时长90天。
至此,我们的安全学习就已经踏上了正轨,需要在工作中不断精进,不断成长。