上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 反汇编
反汇编二进制文件的过程包括将二进制文件运行的汇编指令从其机器码格式重构为人类可读的汇编语言。反汇编最常见的用例包括恶意软件分析、编译器的性能和输出准确性验证、漏洞分析,以及针对闭源软件缺陷进行漏洞利用或概念验证开发。
在这些应用中,漏洞利用开发可能是最需要对实际汇编代码进行分析的。虽然漏洞发现通常可以通过模糊处理等技术来完成,但从检测到的崩溃代码构建漏洞利用或发现为什么某些代码区域无法被模糊测试覆盖,通常需要扎实的汇编知识。
在这种情况下,通过阅读汇编代码对漏洞的确切条件实现精细的掌握是至关重要的。编译器分配变量和数据结构的确切方式对于开发漏洞利用至关重要,因此深入了解汇编知识是必需的。通常一个看似“无法利用”的漏洞,实际上,只要再投入一点创造力和辛勤工作来真正理解易受攻击的功能的内部机制,便可变得可利用。
反汇编可执行文件可以通过多种方式进行,我们将在本书的第二部分更详细地研究这个问题。但是,目前快速查看可执行文件的反汇编输出的最简单的工具之一是Linux工具objdump[3]。
让我们编译并反汇编以下write()程序:
我们可以用GCC编译这段代码并指定-c选项。这个选项告诉GCC在不调用链接进程的情况下创建目标文件,因此我们可以只对编译的代码运行objdump,而不看周围所有目标文件(如C运行时)的反汇编。main函数的反汇编输出如下:
虽然像objdump这样的Linux实用工具对快速反汇编小程序很有用,但较大的程序需要更方便的解决方案。如今存在各种反汇编器可以使逆向工程更高效,包括免费的开源工具(如Ghidra[4])和昂贵的解决方案(如IDA Pro[5])等。这些将在本书的第二部分中进行详细讨论。