文章来源:极手游作者:小狐狸发布时间:2022-11-07 20:01:37
大多数计算机程序都是用C或C之类的高级语言编写的,不能直接运行。在使用它们之前,必须将它们编译成包含计算机可以运行的机器语言的二进制可执行文件。但是,你怎么知道编译后的程序是否和高级源代码有相同的语义呢?令人不安的答案是你不可能知道!
高级语言和二进制机器语言之间有很大的语义鸿沟,所以很少有人知道它们之间是如何关联的。大多数程序员对自己程序的底层运行了解有限,他们只是单纯地相信编译出来的程序会符合自己的意图。因此,许多编译器错误、微小的实现错误、二进制级后门程序和恶意寄生虫都可能被忽略。
更糟糕的是,工业系统、银行系统、嵌入式系统中有无数的二进制程序和库。这些源程序可能会丢失或长期私有,这意味着无法使用常规方法在源代码级别修复这些程序和库或评估其安全性。即使对于大型软件公司来说,这也是一个现实问题。例如,微软最近发布了一个精心制作的二进制补丁,以解决Microsoft Office的公式编辑器程序中的缓冲区溢出问题。
如何在二进制级别分析和修改程序? 《二进制分析实战》 可以消除你的疑虑。
无论您是安全研究员、恶意软件分析师、程序员,还是仅仅对二进制分析感兴趣的人,这些技术都将使您能够掌握并深入理解您每天创建和使用的二进制程序。
这本书的主要目标是使你成为一个全面的二进制分析师,熟悉该领域的所有重要主题,包括基本主题和高级主题,如二进制仪器,染色分析和符号执行。这本书不是一个全面的资源,因为二元分析的领域和工具变化如此之快,一本全面的书可能很快就会过时。相反,这本书的目的是让你知道所有重要的话题,以便你能够更独立地学习。同样,这本书也没有深入解释如何对x86和x86-64代码进行逆向工程(尽管附录A涵盖了基础知识)或分析这些平台上恶意软件的所有复杂性。关于这些话题已经有很多专门的书籍,在此重复其内容毫无意义。
这本书分为四个部分。
介绍第一部分“二进制格式”'s二进制格式,这对理解本书的其余部分是必不可少的。如果您已经熟悉ELF和PE二进制格式以及libbfd,您可以跳过本节中的一个或多个章节。
第1章“二进制简介”提供了二进制程序分析的一般介绍。
介绍在第2章“ELF格式”. Linux上使用的ELF二进制格式
第3章“PE格式简介”包含了对PE和Windows上使用的二进制格式的简要介绍。
第4章“使用libbfd创建二进制加载器”展示了如何使用libbfd解析二进制文件,并构建本书其余部分使用的二进制加载器。
包括第二部分“二进制分析基础”.的基本二进制分析技术
介绍第5章“Linux二进制分析”Linux的基本二进制分析工具。
第6章“反汇编与二进制分析基础”涵盖了基本的拆卸技术和基本的分析模式。
第7章“简单的ELF代码注入技术”,在本章中,你将首次体验如何使用寄生代码注入和十六进制编辑等技术来修改ELF二进制文件。
第三部分“高级二进制分析”引进先进的二元分析技术。
第8章“自定义反汇编”展示了如何使用顶石创建一个自定义的反汇编工具。
第9章“二进制插桩”介绍如何用成熟的二进制工具平台Pin修改二进制文件。
本文介绍了第10章“动态污点分析的原理”动态染色分析的原理,这是一种非常先进的二进制分析技术,可以让您跟踪程序中的数据流。
第11章“基于libdft的动态污点分析”教你用libdft构建自己的动态污点分析工具。
第12章“符号执行原理”专门研究符号执行,这是另一种可以用来自动推理复杂程序属性的高级技术。
第13章“使用Triton实现符号执行”演示了如何使用Triton构建一个实用的符号执行工具。
第四部分“附录”包括对你有用的资源。
附录A“x86汇编快速入门”为不熟悉x86汇编语言的读者提供了简要介绍。
附录B“使用libelf实现PT_NOTE覆盖”提供了第七章使用的elfinject工具的实现细节,并介绍了libelf。
附录C“二进制分析工具清单”包含了你可以使用的二进制分析工具的列表。
什么是二进制分析,为什么需要它
二进制分析是分析计算机二进制程序(称为二进制文件)及其包含的机器代码和数据属性的科学和艺术。简而言之,所有二进制分析的目标都是找出(并可能修改)二进制程序3354的真正属性换句话说,它们真正在做什么,而不是我们认为它们应该做什么。很多人把二进制分析和逆向工程、反汇编联系在一起,这至少部分是对的。反汇编是许多形式的二进制分析中重要的第一步,而逆向工程是二进制分析的常见应用,它通常是记录专有软件或恶意软件行为的唯一方法。然而,二进制分析的领域远不止于此。概括地说,您可以将二进制分析技术分为两类,或者这两类的组合,如下所示。
静态分析。静态分析技术可以分析二进制文件,而无需运行它们。这种方法有两个优点:可以一次性分析整个二进制文件,并且不需要特定的CPU来运行二进制文件。例如,您可以静态分析x86计算机上的ARM二进制文件。然而,这种方法的缺点是静态分析不知道二进制文件在运行时的状态,这使得分析非常具有挑战性。
与动态分析。静态分析相反,动态分析运行二进制文件并在执行过程中分析它们。这种方法通常比静态分析简单,因为您完全了解整个运行时状态,包括变量值和条件分支的结果。但是,你只能看到执行的代码,所以这种方法可能会错过程序中一些有趣的部分。
静态分析和动态分析各有利弊。在这本书里你会学到这两种方法的技巧。除了被动二进制分析,您还将学习二进制插装技术,在没有源代码的情况下修改二进制程序。二进制插装依赖于诸如反汇编之类的分析技术,它可以用来辅助二进制分析。鉴于二元分析和插桩技术的这种共生关系,本书涵盖了这两方面的内容。
如前所述,您可以使用二进制分析来记录和测试没有源代码的程序。然而,即使有可用的源代码,二进制分析对于发现细微的错误也特别有用,这些错误在二进制级别比在源代码级别更清楚地反映出来。许多二进制分析技术对于高级调试也很有用。这本书介绍了可以在这些场景中使用的二元分析技术。
二进制分析因何具有挑战性
二进制分析具有挑战性,并且比源代码级别的等效分析困难得多。事实上,许多二进制分析任务基本上是不确定的,这意味着不可能建立一个对这些问题总是返回正确结果的分析引擎!为了让你对即将到来的挑战有个概念,下面是二进制分析困难的原因。不幸的是,这份清单远非详尽无遗。
没有符号信息。当我们用C或C之类的高级语言编写源代码时,我们用有意义的名字来命名变量、函数和类等结构。我们称这些名字为符号信息,或简称为符号。好的命名约定使源代码更容易理解,但它们在二进制级别上并不真正相关。因此,通常会从二进制文件中删除符号,这使得理解代码更加困难。没有类型信息。高级语言的另一个特点是具有定义良好的变量类型(如int、float或string)和更复杂的数据结构(如struct type)。相反,在二进制级别,类型从未被显式声明,这使得很难推断数据的用途和结构。现代没有高级抽象。程序分为类和函数,但编译器丢弃了这些高级信息。这意味着二进制文件看起来像许多代码和数据,而不是一个结构良好的程序,因此将其恢复到高级结构的过程非常复杂,而且容易出错。混合代码和数据。二进制文件可以(也确实)包含混合了可执行代码的数据。这使得将数据解释成代码变得容易。反之亦然,但这会导致错误的结果。由于位置相关的代码和数据。二进制文件的设计初衷并不包含可修改性,所以即使只增加一条机器指令,也可能发生其他代码移位,从而使代码中内存地址等地方的引用失效。因此,任何类型的代码或数据修改都极具挑战性,并且很容易破坏二进制文件。由于这些挑战,我们在实践中经常不得不面对不准确的分析结果。二进制分析的一个重要部分是以创造性的方式构建可用的工具,尽管存在分析错误!
谁需要阅读这本书
本书的目标读者包括安全工程师、学术安全研究人员、逆向工程师、恶意软件分析师和对二进制分析感兴趣的计算机科学学生。
另外,因为这本书涵盖了高级知识,所以一些编程和计算机系统的基础知识是必要的。为了充分利用这本书,你应该具备以下几点:
C和C可用于有效编程;了解操作系统内部(进程是什么,虚拟内存是什么等等。);了解如何使用Linux shell(尤其是bash);x86/x86-64汇编程序的工作知识。如果您还不知道任何程序集,请确保先阅读附录A。如果你以前没有写过程序,或者不喜欢钻研计算机系统的底层细节,那么这本书可能不适合你。
大掌门2金将怎么组合