Linux 二进制分析

内容简介

二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案。本书将带领读者探索连一些专家都未曾接触的领域,正式进入计算机黑客世界。

本书是一本剖析 Linux ELF 工作机制的图书,共分为9章,其内容涵盖了 Linux 环境和相关工具、ELF 二进制格式、Linux 进程追踪、ELF 病毒技术、Linux 二进制保护、Linux 中的 ELF 二进制取证分析、进程内存取证分析、扩展核心文件快照技术、Linux/proc/kcore 分析等。

如果你是一名软件工程师或者逆向工程师,想要学习 Linux 二进制分析相关的内容,本书实为明智之选。本书提供了在安全、取证和杀毒领域中实施二进制分析的解决方案。本书也适合安全爱好者和系统工程师阅读。为了更好地理解本书内容,读者需要具备一定的 C 语言编程基础和 Linux 命令行知识

作者简介

Ryan O'Neill(ELF 大师)是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

他的职业生涯非常成功,曾任职于 Pikewerks、Leviathan 安全集团这样的大公司,近在 Backtrace 担任软件工程师。

Ryan 还未出版过其他图书,不过他在 Phrack 和 VXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站上找到。

本书内容

译者序

译者棣琦(本名张萌萌),曾梦想成为一名高级口译,却阴差阳错成了一个爱写代码的程序员。在 IT 江湖升级打怪的过程中,为了不断提高自己的技能,看书是少不了的;而要想成为高级玩家,看英文书自然也是必须。一个很偶然的机会,我接触到了本书的英文版。第一遍翻看时略显吃力,毕竟书中讲述的许多概念都是作者的原创,网上几无相关资料。但是这些稀缺的内容对于深入理解二进制分析却非常重要,译者由此尝到了知识的甜头。本着“独乐乐不如众乐乐”和“知识分享”的目的,本书的翻译之路就这样顺理成章地开始了。

要想成为一名真正的黑客,不仅要会编写程序,还需要解析程序,对已有的二进制文件进行反编译,洞悉程序的工作原理。而本书完全是作者多年来在逆向工程领域的实战经验总结,其内容从 Linux 二进制格式的简单介绍到二进制逆向的细节,不一而足。书中还穿插了作者自己维护的许多项目或软件代码示例。相信通过本书的学习,读者完全可以掌握 Linux 二进制分析相关的一套完整的知识体系,为成长为一名高水平的黑客打下坚实的基础。考虑到本书并非针对零基础的读者编写,因此建议读者能够有一定的 C 语言和 Linux 基础,以便更好地理解领会书中精华。另外,任何 IT 技术的学习掌握,都离不开动手操作。读者要想叩开 Linux 二进制世界的大门,需要亲自动手实践书中示例,才能将书本知识转换为自身技能。

最后,不能免俗的是各种致谢(虽然俗,但诚意百分百)。感谢我的父母对我闯荡江湖的支持,感谢 Linux 中国创始人王兴宇的信赖,感谢语音识别领域的技术大牛姚光超提出的宝贵建议,感谢我的朋友 Ray 对我的鼓励。当然,更要感谢各位读者的支持。

最后的最后,由于译者水平有限,外加本书作者在表达上多有晦涩之处,因此译文难免有纰漏,还望广大读者以及业内同行批评指正。

2017年9月

北京

关于作者

Ryan O'Neill 是一名计算机安全研究员兼软件工程师,具有逆向工程、软件开发、安全防御和取证分析技术方面的背景。他是在计算机黑客亚文化的世界中成长起来的——那个由 EFnet、BBS 系统以及系统可执行栈上的远程缓冲区溢出组成的世界。他在年轻时就接触了系统安全、开发和病毒编写等领域。他对计算机黑客的极大热情如今已经演变成了对软件开发和专业安全研究的热爱。Ryan 在 DEFCON 和 RuxCon 等很多计算机安全会议上发表过演讲,还举办了一个为期两天的 ELF 二进制黑客研讨会。

他的职业生涯非常成功,曾就职于 Pikewerks、Leviathan 安全集团这样的大公司,最近在 Backtrace 担任软件工程师。

Ryan 还未出版过其他图书,不过他在 PhrackVXHeaven 这样的在线期刊上发表的论文让他声名远扬。还有许多其他的作品可以从他的网站(http://www.bitlackeys.org)上找到。

致谢

首先,要向我的母亲 Michelle 致以真诚的感谢,我已经将对她的感谢表达在这本书里了。这一切都是从母亲为我买的第一台计算机开始的,随后是大量的图书,从 UNIX 编程,到内核内部原理,再到网络安全。在我生命中的某一刻,我以为会永远放弃计算机,但是大约过了5年之后,当我想要重新点燃激情时,却发现已经把书扔掉了。随后我发现母亲偷偷地把那些书帮我保存了起来,一直到我重新需要的那一天。感谢我的母亲,你是最美的,我爱你。

还要感谢我生命中最重要的一个女人,她是我的另一半,是我的孩子的母亲。毫无疑问,如果没有她,就不会有我今天生活和事业上的成就。人们常说,每一个成功男人的背后都有一个伟大的女人。这句古老的格言道出的的确是真理。感谢 Marilyn 给我带来了极大的喜悦,并进入了我的生活。我爱你。

我的父亲 Brian O'Neill 在我生活中给了我巨大的鼓舞,教会了我为人夫、为人父和为人友的许多东西。我爱我的父亲,我会一直珍惜我们之间哲学和精神层面的交流。

感谢 Michael 和 Jade,感谢你们如此独特和美好的灵魂。我爱你们。

最后,要感谢我的3个孩子:Mick、Jayden 和 Jolene。也许有一天你们会读到这本书,知道你们的父亲对计算机略知一二。我会永远把你们放在生活的首位。你们3个是令我惊奇的存在,为我的生活带来了更深刻的意义和爱。

Silvio Cesare 在计算机安全领域是一个传奇的名字,因为他在许多领域都有高度创新和突破性的研究,从 ELF 病毒,到内核漏洞分析方面的突破。非常感谢 Silvio 的指导和友谊。我从你那里学到的东西要远远多于从我们行业其他人处所学的东西。

Baron Oldenburg 也对本书起了很大的推动作用。好多次由于时间和精力的原因我几乎要放弃了,幸好 Baron 帮我进行了初始的编辑和排版工作。这为本书的编写减轻了很大的负担,并最终促使本书问世。谢谢 Baron!你是我真正的朋友。

Lorne Schell 是一位真正的文艺复兴式的人物——软件工程师、音乐家、艺术家。本书的封面就是出自他的聪慧之手。Vitruvian(维特鲁威风格的)Elf 与本书的描述艺术性的重合是多么令人惊喜!非常感谢你的才华,以及为此付出的时间和精力。

Chad Thunberg 是我在 Leviathan 安全集团工作时的老板,他为我编写本书提供了所需要的资源和支持。非常感谢!

感谢 Efnet 网站所有在#bitlackeys上的朋友的友谊和支持!

关于审稿人

Lubomir Rintel 是一名系统程序员,生活在捷克的布尔诺市。他是一位全职的软件开发人员,目前致力于 Linux 网络工具的开发。除此之外,他还对许多项目做出过贡献,包括 Linux 内核和 Fedora 发行版。活跃在开源软件社区多年之后,他懂得一本好书涵盖的主题要比参考手册更加广泛。他相信本书就是这样,希望你也能够像他一样喜欢这本书。另外,他还喜欢食蚁兽。

截至2015年11月,Kumar Sumeet 在 IT 安全方面已经有4年多的研究经验了,在此期间,他开创了黑客和间谍工具的前沿。他拥有伦敦大学皇家霍洛威分校的信息安全硕士学位,最近的重点研究领域是检测网络异常和抵御威胁的机器学习技术。

Sumeet 目前是 Riversafe 公司的一名安全顾问。Riversafe 是伦敦的一家网络安全和 IT 数据管理咨询公司,专注于一些尖端的安全技术。该公司也是2015年在 EMEA 地区的 Splunk Professional Services 的合作伙伴。他们已经完成了涉及许多领域(包括电信、银行和金融市场、能源和航空局)的大型项目。

Sumeet 也是 Penetration Testing Using Raspberry Pi(Packt Publishing 出版)一书的技术审稿人。

Linux 二进制分析_第1张图片

有关他的项目和研究的更多详细信息,可以访问他的网站https://krsumeet.com,或者扫描右侧的二维码。

你也可以通过电子邮件[email protected]联系他。

Heron Yang 一直致力于创造人们真正想要的东西。他在高中时就建立了这样坚定的信仰。随后他在台湾交通大学和卡内基梅隆大学专注于计算机科学的研究。在过去几年,他专注于在人和满足用户需求之间建立联系,致力于开发初创企业创意原型、新应用或者网站、学习笔记、出书、写博客等。


感谢 Packt 给我这个机会参与本书的创作过程,并感谢 Judie Jose 在本书的创作过程中给我的很多帮助。此外,感谢我经历过的所有挑战,这让我成为一个更好的人。本书深入二进制逆向的诸多细节,对于那些关心底层机制的人来说会是很好的资料。大家可通过[email protected]或者http://heron.me跟我打招呼或讨论图书内容。

前言

软件工程是创建能够在微处理器上存在、运行和发挥作用的造物行为。我们称这种造物为程序。逆向工程是发现程序如何运行和发挥作用的行为,进一步讲,就是使用反编译器和逆向工具进行组合,并依靠我们的专业技能来控制要进行反编译的目标程序,来理解、解析或者修改程序的行为。我们需要理解二进制格式、内存布局和给定处理器的指令集的复杂性,才能控制微处理器上某个程序的生命周期。逆向工程师是掌握了二进制领域相关知识的技术人员。本书将教会你成为一名 Linux 二进制黑客所需要的合理的课程、洞察力和相关任务。当一个人自称逆向工程师的时候,他自己其实已经超出了工程师的水平。一个真正的黑客不仅可以编写代码,还可以解析代码,反编译二进制文件和内存段,他追求的是修改软件程序的内部工作原理。这就是反编译工程师的动力。

从专业或者兴趣爱好的角度来看,我都会在计算机安全领域(无论是漏洞分析、恶意软件分析、防病毒软件、rootkit 检测,还是病毒设计)使用自己在逆向工程方面的技能。本书的大部分内容专注于计算机安全方面。我们会分析内存转储、进程镜像重建,并对二进制分析更深奥的领域进行探索,包括 Linux 病毒感染和二进制取证分析。我们将会解析被恶意软件感染的二进制文件,还会感染运行中的进程。本书旨在解释 Linux 逆向工程所必需的组件,因此我们会深入学习 ELF(可执行文件和链接格式)。ELF 是 Linux 中可执行文件、共享库、核心转储文件和目标文件的二进制格式。本书最重要的一个方面是针对 ELF 二进制格式的结构复杂性给出了深入的分析。ELF 节、段、动态链接等这些概念都是非常重要的,也是逆向工程方面相关知识的比较有意思的分支。我们将会深入探索 ELF 二进制攻击,并了解如何将这些技能应用到更广泛的工作中。

本书的目标是让读者成为对 Linux 二进制攻防有扎实基础的少数人之一,这将会为打开创新性研究的大门提供一个非常广泛的主题,并将读者带领到 Linux 操作系统高级黑客技术的前沿。你将掌握 Linux 二进制修补、病毒工程化/分析、内核取证分析和 ELF 二进制格式这一套宝贵的知识体系。读者也会对程序执行和动态链接有更深入的了解,对二进制保护和调试的内部原理有更深入的理解。

我是一名计算机安全研究员、软件工程师,也是一名黑客。本书只是有组织地对我所做过的研究进行了文档性描述,也是对已经做出研究结果的一些基础知识的描述。

本书所涵盖的很多知识都无法在互联网上找到。本书试图将一些相关联的主题集中在一起,以便作为 Linux 二进制和内存攻击这一主题的入门手册和参考。虽然不是非常完善,不过也涵盖了入门需要的很多核心信息。

本书涵盖的内容

第1章,Linux 环境和相关工具,简要介绍了 Linux 环境和相关的工具,在整本书中都会用到。

第2章,ELF 二进制格式,帮助读者了解 ELF 二进制格式每个主要的组件,在 Linux 和大多数类 UNIX 系统上都会用到。

第3章,Linux 进程追踪,教会读者使用 ptrace 系统调用读写进程内存并注入代码。

第4章,ELF 病毒技术——Linux/UNIX 病毒,将会介绍 Linux 病毒的过去、现在和将来,以及病毒的工程化和围绕病毒进行的相关研究。

第5章,Linux 二进制保护,解释 ELF 二进制保护的基本原理。

第6章,Linux 下的 ELF 二进制取证分析,通过解析 ELF 目标文件来研究病毒、后门和可疑的代码注入。

第7章,进程内存取证分析,将会介绍如何解析进程的地址空间,以研究内存中的恶意软件、后门和可疑的代码注入。

第8章,ECFS——扩展核心文件快照技术,是对 ECFS 这一用于深入进程内存取证分析的新开源产品的介绍。

第9章,Linux/proc/kcore 分析,介绍了如何使用/proc/kcore 进行内存分析来检测 Linux 内核中的恶意软件。

阅读本书的先决条件

阅读本书的先决条件如下:假定读者具有 Linux 命令行相关的操作知识,对 C 语言编程技巧有一定的理解,对 x86 汇编语言知识有基本的掌握(不是必需,但会有很大的帮助)。有句话说得好:“如果你可以读懂汇编语言,那么一切都是开源的”。

本书读者对象

如果你是一名软件工程师或者逆向工程师,想学习 Linux 二进制分析相关的更多知识,本书将会为你提供在安全、取证分析和防病毒领域进行二进制分析所需要用到的一切知识。假如你是一位安全技术领域的爱好者或者是一名系统工程师,并且有 C 语言编程和 Linux 命令行相关的经验,这本书将非常适合你。

第1章 Linux 环境和相关工具

      • 1.1 Linux 工具
        • 1.1.1 GDB
        • 1.1.2 GNU binutils 中的 objdump
        • 1.1.3 GNU binutils 中的 objcopy
        • 1.1.4 strace
        • 1.1.5 ltrace
        • 1.1.6 基本的 ltrace 命令
        • 1.1.7 ftrace
        • 1.1.8 readelf
        • 1.1.9 ERESI——ELF 反编译系统接口
      • 1.2 有用的设备和文件
        • 1.2.1 /proc//maps
        • 1.2.2 /proc/kcore
        • 1.2.3 /boot/System.map
        • 1.2.4 /proc/kallsyms
        • 1.2.5 /proc/iomem
        • 1.2.6 ECFS
      • 1.3 链接器相关环境指针
        • 1.3.1 LD_PRELOAD 环境变量
        • 1.3.2 LD_SHOW_AUXV 环境变量
        • 1.3.3 链接器脚本
      • 1.4 总结

本章将集中介绍 Linux 环境,因为这将贯穿整本书的始终。本书的重点是对 Linux 二进制进行分析,那么利用好 Linux 自带的一些通用的本地环境工具将会对 Linux 二进制分析非常有帮助。Linux 自带了应用普遍的 binutils 工具,该工具也可以在网站http://www.gnu.org/software/binutils/中找到,里面包含了一些用于二进制分析和破解的工具。本书不会介绍二进制逆向工程的通用软件 IDA Pro,但还是鼓励读者使用它。不过,在本书中不会使用 IDA。然而,通过本书的学习,你可以利用现有的环境对任何 Linux 系统进行二进制破解。由此,便可以欣赏到作为一个真正的黑客可以利用许多免费工具的 Linux 环境之美。在本书中,我们将会展示各种工具的使用,随着每个章节的推进,也会不断回顾这些工具的使用方法。现在我们将本章作为参考章节,介绍 Linux 环境下的相关工具和技巧。如果你已经非常熟悉 Linux 环境以及反编译、调试、转换 ELF 文件的工具,可以跳过本章。

1.1 Linux 工具

在本书中将用到许多公开发布的免费工具。本节内容将会对其中某些工具进行概要阐述。

1.1.1 GDB

GNU 调试器(GDB)不仅可以用来调试有 bug 的应用程序,也可以用来研究甚至改变一个程序的控制流,还可以用来修改代码、寄存器和数据结构。对于一个致力于寻找软件漏洞或者破解一个内部非常复杂的病毒的黑客来讲,这些都是非常常见的工作。GDB 主要用于分析 ELF 二进制文件和 Linux 进程,是 Linux 黑客的必备工具,在本书中我们也会在各种不同的例子中使用到 GDB。

1.1.2 GNU binutils 中的 objdump

object dump(objdump)是一种对代码进行快速反编译的简洁方案,在反编译简单的、未被篡改的二进制文件时非常有用,但是要进行任何真正有挑战性的反编译任务,特别是针对恶意软件时,objdump 就显示出了它的局限性。其最主要的一个缺陷就是需要依赖 ELF 节头,并且不会进行控制流分析,这极大地降低了 objdump 的健壮性。如果要反编译的文件没有节头,那么使用 objdump 的后果就是无法正确地反编译二进制文件中的代码,甚至都不能打开二进制文件。不过,对于一些比较平常的任务,如反编译未被加固、精简(stripped)或者以任何方式混淆的普通二进制文件,objdump 已经足够了。objdump 可以读取所有常用的 ELF 类型的文件。下面是关于 objdump 使用方法的一些常见例子。

  • 查看 ELF 文件中所有节的数据或代码:
    objdump –D  
  • 只查看 ELF 文件中的程序代码:
    objdump –d  
  • 查看所有符号:
    objdump –tT  

在第2章介绍ELF二进制格式时,我们将更加深入地介绍objdump和其他相关工具。

1.1.3 GNU binutils 中的 objcopy

object copy(objcopy)是一款非常强大的小工具,很难用一句话对其进行概述。推荐读者参考objcopy的使用手册,里面描述得非常详细。虽然objcopy的某些特征只针对特定的ELF目标文件,但是,它还可以用来分析和修改任意类型的ELF目标文件,还可以修改ELF节,或将ELF节复制到ELF二进制中(或从ELF二进制中复制ELF节)。

要将.data节从一个ELF目标文件复制到另一个文件中,可以使用下面的命令:

objcopy –only-section=.data   

objcopy工具会在本书的后续内容中用到。现在只要记住有这样一个工具,并且知道这是对 Linux 二进制黑客来说非常有用的一个工具就可以了。

1.1.4 strace

system call trace(strace,系统调用追踪)是基于ptrace(2)系统调用的一款工具,strace通过在一个循环中使用PTRACE_SYSCALL请求来显示运行中程序的系统调用(也称为 syscalls)活动相关的信息以及程序执行中捕捉到的信号量。strace在调试过程中非常有用,也可以用来收集运行时系统调用相关的信息。

使用strace命令来跟踪一个基本的程序:

strace /bin/ls –o ls.out 

使用strace命令附加到一个现存的进程上:

strace –p  -o daemon.out 

原始输出将会显示每个系统调用的文件描述编号,系统调用会将文件描述符作为参数,如下所示:

SYS_read(3, buf, sizeof(buf)); 

如果想查看读入到文件描述符3中的所有数据,可以运行下面的命令:

strace –e read=3 /bin/ls 

也可以使用–e write=fd命令查看写入的数据。strace是一个非常有用的小工具,会在很多地方用到。

1.1.5 ltrace

library traceltrace,库追踪)是另外一个简洁的小工具,与strace非常类似。ltrace 会解析共享库,即一个程序的链接信息,并打印出用到的库函数。

1.1.6 基本的 ltrace 命令

除了可以查看库函数调用之外,还可以使用-S标记查看系统调用。ltrace命令通过解析可执行文件的动态段,并打印出共享库和静态库的实际符号和函数,来提供更细粒度的信息:

ltrace  -o program.out 

1.1.7 ftrace

function traceftrace,函数追踪)是我自己设计的一个工具。ftrace 的功能与ltrace类似,但还可以显示出二进制文件本身的函数调用。我没有找到现成的实现这个功能的 Linux 工具,于是就决定自己编码实现。这个工具可以在网站https://github.com/elfmaster/ftrace找到。下一章会对这个工具的使用进行介绍。

1.1.8 readelf

readelf命令是一个非常有用的解析ELF二进制文件的工具。在进行反编译之前,需要收集目标文件相关的信息,该命令能够提供收集信息所需要的特定于ELF的所有数据。在本书中,我们将会使用readelf命令收集符号、段、节、重定向入口、数据动态链接等相关信息。readelf命令是分析ELF二进制文件的利器。第2章将对该命令进行更深入的介绍,下面是几个常用的标记。

  • 查询节头表:
    readelf –S   
  
  • 查询程序头表:
    readelf –l   
  
  • 查询符号表:
    readelf -s   
  
  • 查询 ELF 文件头数据:
    readelf –e   
  
  • 查询重定位入口:
    readelf –r   
  
  • 查询动态段:
    readelf –d   
  

1.1.9 ERESI——ELF 反编译系统接口

ERESI 工程(http://www.eresi-project.org)中包含着许多 Linux 二进制黑客梦寐以求的工具。令人遗憾的是,其中有些工具没有持续更新,有的与64位 Linux 不适配。ERESI 工程支持许多的体系结构,无疑是迄今为止最具创新性的破解 ELF 二进制文件的工具集合。由于我个人不太熟悉 ERESI 工程中工具的用法,并且其中有些不再更新,因此在本书中就不再对该工程进行更深入的探讨了。不过,有两篇 Phrack 的文章能够说明 ERESI 工具的创新和强大的特性:

  • Cerberus ELF interface(http://www.phrack.org/archives/issues/61/8.txt
  • Embedded ELF debugging(http://www.phrack.org/archives/issues/63/9.txt

1.2 有用的设备和文件

Linux 有许多文件、设备,还有/proc入口,它们对狂热的黑客还有反编译工程师来说都非常有用。在本书中,我们将会展示其中许多有用的文件。下面介绍本书中常用的一些文件。

1.2.1 /proc//maps

/proc//map文件保存了一个进程镜像的布局,通过展现每个内存映射来实现,展现的内容包括可执行文件、共享库、栈、堆和 VDSO 等。这个文件对于快速解析一个进程的地址空间分布是至关重要的。在本书中会多次用到该文件。

1.2.2 /proc/kcore

/proc/kcoreproc文件系统的一项,是 Linux 内核的动态核心文件。也就是说,它是以 ELF 核心文件的形式所展现出来的原生内存转储,GDB 可以使用/proc/kcore来对内核进行调试和分析。第9章会更深入地介绍/proc/kcore。

1.2.3 /boot/System.map

这个文件在几乎所有的 Linux 发行版中都有,对内核黑客来说是非常有用的一个文件,包含了整个内核的所有符号。

1.2.4 /proc/kallsyms

kallsymsSystem.map类似,区别就是 kallsyms 是内核所属的/proc的一个入口并且可以动态更新。如果安装了新的 LKM(Linux Kernel Module),符号会自动添加到/proc/kallsyms中。/proc/kallsyms包含了内核中绝大部分的符号,如果在CONFIG_KALLSYMS_ALL内核配置中指明,则可以包含内核中全部的符号。

1.2.5 /proc/iomem

iomem是一个非常有用的 proc 入口,与/proc//maps类似,不过它是跟系统内存相关的。例如,如果想知道内核的 text 段所映射的物理内存位置,可以搜索Kernel字符串,然后就可以查看 code/text段、data段和bss段的相关内容:

  $ grep Kernel /proc/iomem   01000000-016d9b27 : Kernel code   016d9b28-01ceeebf : Kernel data   01df0000-01f26fff : Kernel bss 

1.2.6 ECFS

extended core file snapshot(ECFS,扩展核心文件快照)是一项特殊的核心转储技术,专门为进程镜像的高级取证分析所设计。这个软件的代码可以在https://github.com/elfmaster/ecfs看到。第8章将会单独介绍 ECFS 及其使用方法。如果你已经进入到了高级内存取证分析阶段,你会非常想关注这一部分内容。

1.3 链接器相关环境指针

动态加载器/链接器以及链接的概念,在程序链接、执行的过程中都是避不开的基本组成部分。在本书中,你还会学到更多相关的概念。在 Linux 中,有许多可以代替动态链接器的方法可供二进制黑客使用。随着本书的深入,你会开始理解链接、重定向和动态加载(程序解释器)的过程。下面是几个很有用处的链接器相关的属性,在本书中将会用到。

1.3.1 LD_PRELOAD 环境变量

LD_PRELOAD环境变量可以设置成一个指定库的路径,动态链接时可以比其他库有更高的优先级。这就允许预加载库中的函数和符号能够覆盖掉后续链接的库中的函数和符号。这在本质上允许你通过重定向共享库函数来进行运行时修复。在后续的章节中,这项技术可以用来绕过反调试代码,也可以用作用户级 rootkit。

1.3.2 LD_SHOW_AUXV 环境变量

该环境变量能够通知程序加载器来展示程序运行时的辅助向量。辅助向量是放在程序栈(通过内核的 ELF 常规加载方式)上的信息,附带了传递给动态链接器的程序相关的特定信息。第3章将会对此进行进一步验证,不过这些信息对于反编译和调试来说非常有用。例如,要想获取进程镜像 VDSO 页的内存地址(也可以使用maps文件获取,之前介绍过),就需要查询AT_SYSINFO

下面是一个带有LD_SHOW_AUXV辅助向量的例子:

$ LD_SHOW_AUXV=1 whoami AT_SYSINFO: 0xb7779414 AT_SYSINFO_EHDR: 0xb7779000 AT_HWCAP: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmovpat pse36 clflush mmx fxsr sse sse2 AT_PAGESZ: 4096 AT_CLKTCK: 100 AT_PHDR:  0x8048034 AT_PHENT: 32 AT_PHNUM: 9 AT_BASE:  0xb777a000 AT_FLAGS: 0x0 AT_ENTRY: 0x8048eb8 AT_UID:  1000 AT_EUID: 1000 AT_GID:  1000 AT_EGID: 1000 AT_SECURE: 0 AT_RANDOM: 0xbfb4ca2b AT_EXECFN: /usr/bin/whoami AT_PLATFORM: i686 elfmaster 

第2章将会进一步介绍辅助向量。

1.3.3 链接器脚本

链接器脚本是我们的一个兴趣点,因为链接器脚本是由链接器解释的,把程序划分成相应的节、内存和符号。默认的链接器脚本可以使用ld–verbose查看。

ld链接器程序有其自己解释的一套语言,当有文件(如可重定位的目标文件、共享库和头文件)输入时,ld链接器程序会用自己的语言来决定输出文件(如可执行程序)的组织方式。例如,如果输出的是一个 ELF 可执行文件,链接器脚本能够决定该输出文件的布局,以及每个段里面包含哪些节。另外举一个例子:.bss节总是放在data段的末尾,这就是链接器脚本决定的。你可能很好奇,这为什么就成了我们的一个兴趣点呢?一方面,对编译时链接过程有一定深入的了解是很重要的。gcc依赖于链接器和其他程序来完成编译的任务,在某些情况下,能够控制可执行文件的布局相当重要。ld命令语言是一门相当深入的语言,尽管它超出了本书的范围,但是非常值得探究。另一方面,在对可执行文件进行反编译时,普通段地址或者文件的其他部分有时候会被修改,这就表明引入了一个自定义的链接器脚本。gcc通过使用–T标志来指定链接器脚本。第5章会介绍一个使用链接器脚本的例子。

1.4 总结

本章仅介绍了 Linux 环境和工具相关的一些基本概念,在后续的每个章节中都会经常用到。二进制分析主要是了解一些可用的工具和资源并进行相关的整合。目前,我们只简要介绍了这部分工具,在接下来的章节中,随着对 Linux 二进制破解这个广阔领域进行更进一步的探索,我们会有机会对每一个工具进行深入介绍。下一章将会对 ELF 二进制格式进行更深入的探索,也会涉及其他一些有趣的概念,如动态链接、重定位、符号和节(section)等。

第2章 ELF 二进制格式(上)
第2章 ELF 二进制格式(下)
第3章 Linux 进程追踪(上)
第3章 Linux 进程追踪(下)
第4章 ELF 病毒技术——Linux/UNIX 病毒
第5章 Linux 二进制保护
第6章 Linux 下的 ELF 二进制取证分析
第7章 进程内存取证分析
第8章 ECFS——扩展核心文件快照技术(上)
第8章 ECFS——扩展核心文件快照技术(下)
第9章 Linux/proc/kcore 分析

阅读全文: http://gitbook.cn/gitchat/geekbook/5ba9eb5b0110e7701d264575

你可能感兴趣的:(Linux 二进制分析)