逆向工程和程序理解.doc

  1. 1、本文档共64页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
逆向工程和程序理解

第3章 逆向工程和程序理解 大多数人与计算机程序的交互只是处于表层,他们急切地输入并(不耐烦地?!)等待着程序的某个响应;大多数程序与用户的交互界面可能非常简单,但是实际却比它们第一眼看起来深奥得多。只有在程序的“内脏”中才会发生真正有趣的事情,而这才是体现程序深奥的地方。这些“内脏”可能非常复杂。攻击软件通常需要了解有关软件“内脏层”的知识。 潜在的攻击者惟一的最重要技能,是拥有分解目标软件复杂性的能力。这被称作“逆向工程(reverse engineering)”,或者有时只是简单地称作为“逆向(reversing)”。软件攻击者可以使用某些很好的工具;但是软件攻击不是变魔术,并且也不存在带有魔力的软件攻击工具。为了攻击某个不一般的目标软件,攻击者也必须用不一般的方法控制这个目标软件。虽然在攻击中几乎一直都会使用某些工具(比如反汇编工具、脚本产生工具、输入产生工具等),但是这些都是非常基础的工具。真正的智慧仍属于攻击者! 在攻击软件时,基本思想是充分理解编写这个软件系统的人所使用的前提假设,然后设法暗中破坏这些假设(这就是在设计和编写软件时,为什么需要尽可能多地明确一些假设的原因)。逆向工程是寻找这些假设—— 尤其是可以在攻击中用到的默认假设—— 的非常优秀的方法1。 3.1 进入逻辑的“房屋” 一些情况下,程序自身被一些有价值的数据包围着,并且有一些规则用来决定谁有权利访问这些数据,以及什么时候可以访问这些数据。程序与外界接触的边界相当于是房屋内部与外界接触的“门”。有修养的用户会通过“门”进而访问他们所需要的存储在程序内部的数据。这些“门”就是进入软件的入口点。问题是,有修养的用户用来访问数据的门也能被远程攻击者利用。 例如,试着考虑基于Internet的软件的非常普通的门—— TCP/IP端口。虽然在一个标准的程序中有很多类型的门,但是很多的攻击者首先寻找的就是TCP/IP端口。只需要使用端口扫描工具便可以寻找TCP/IP端口。端口能提供对软件程序的公共访问权。但是寻找门还仅仅只是开始。一个标准的程序是很复杂的,就像一座由很多房间组成的房屋,通常只有在房屋的深处才能发现最好的宝藏。在几乎所有琐碎的攻击中,攻击者必须通过公共的门,穿越复杂的软件路径,才能进入软件房屋的最深处。一座不熟悉的房屋对于攻击者而言就像是一座迷宫。成功穿越这座迷宫所得到的奖赏是能访问到软件中的数据,或者有时候能完全控制软件程序。 软件是由一系列指令组成的,这些指令决定了通用的计算机能做什么事情。因此,从某种程度上看,软件程序就是一台特殊的机器(由计算机和机器指令组成),而这样的机器很明显地应该含有显式的规则,以及已经定义好的行为。虽然在机器上运行某个程序时,程序的行为是一览无余的,但是观察代码并进一步了解程序的内部行为则需要更多的努力。在有些情况下,我们可以阅读某个程序的源代码;而在另外一些情况下,则无法获取程序的源代码。因此,攻击技术不能总依赖于能够获得的源代码。事实上,一些攻击技术具有很大的研究价值,它们根本不考虑是否能够获得程序的源代码,而另外一些攻击技术可以通过机器指令重构源代码。上述这些技术是本章讨论的重点。 3.1.1 逆向工程 逆向工程是通过建立机器原型,观察机器和机器行为,发现机器运行规则的过程。从高一层上来说,这个过程包括理解我们初始时在技术上没有完全理解的一些信息,并进一步完全理解其功能、其本质以及其构造。一名好的逆向工程师应该试图了解软件的细节信息,因而也就有必要了解运行软件程序的计算机的所有功能。一名逆向工程师不仅需要深入理解硬件和软件,同时还需要理解它们是如何协同工作的。 设想一下软件程序是如何处理来自外部的输入的。外部“用户”的输入可以包括命令和数据。在目标中的每条代码路径都包括大量基于外部输入的控制决策。有时,某条代码路径会比较“宽”,可以允许任意数量的消息成功地通过;而有时某条代码路径会比较“窄”,如果没有完全正确的输入格式,路径则会关闭甚至有可能会中断。如果拥有合适的工具,则可以探测到这一系列弯弯曲曲的路径。图3-1显示了在一个普通的FTP服务器程序中探索代码路径的情况。在这幅图中,正在探测某个复杂的子程序,每个方框都对应着一段机器指令。 一般说来,进入某个程序越深,那么输入的“启动”位置与程序最终结束的位置之间的代码路径就越长。如果希望能到达逻辑房屋中某个特殊的位置,那么需要在不同的房间之间存在有相关的路径(但愿这些路上存在有用的数据)。在通过内部的每一扇门时,都会把一定的规则强加于可能传送的各种各样的信息之上。因此,在房间与房间之间漫游需要与接受输入的各种规则集“谈判”。这就使得构造可以顺利通过很多扇门(有外部的门也有内部的门)的输入具有真正的挑战性。一般说来,当进入目标程序越深,攻击输入也越来越精确化

文档评论(0)

laolao123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档