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