CHAPTER 3 第3章i 调试器与仿真器的仿真 许多年以前,黑客主要使用反汇编器与调试器。现在,这个传统的工具集中添加了各式仿真 器,它们为代码挖掘几乎提供了无限的可能。就在前不久,这些仿真器只是大型公司才拥有的工 具,如今则成为所有代码分析机构的寻常物件了。那么,什么是仿真器?仿真器可以提供什么样 的能力呢? 3.1仿真器概述 一般地说,仿真是指一个程序或者设备模仿另外一个程序或者设备的能力。例如,在从8位机 到功能更强的BM PC XT/AT机的过渡时期,仿真器用得最多的地方是老式拱廊游戏,因为这款游 戏没有可直接在IBM PC上运行的类似产品。开发人员可不想将自己钟爱的低档机器随便抛弃了 事,因此他们转而为低档机编写了成千上万的这种仿真器。于是,仿真器如雨后春笋般迅速涌现出 来。十年过后,历史再次重演。隶属于Windows NT家族的系列操作系统成为操作系统事实上的标 准,但是它却阻止对硬件的直接访问,在这样的情况下,90%左右的计算机游戏要么不能在Windows NT平台下运行,要么虽然能勉强运行但是游戏伴音却没了。于是,DOSBox与其他仿真器随之被 推出,使用户逆转时光而重享老游戏所带来的欢娱。 仿真的想法,并不是一下子冒出来的。恰恰相反,它经历了一个漫长的发展过程。 3.2历史概祝 早在l974年多任务概念出现之后Gerald Popek与Robert Goldberg提出了虚拟思想。他们在题 为“虚拟化第三代体系结构的形式要求(Formal Requirements for Virtualizable Third Generation Architectures)”(htp:/laoi.acm.org/10.1145/361011361073/)的文章中,提出了虚拟思想。 要同时运行几个操作系统,中央处理器(CPU)必须支持虚拟内存,并确保提供可用命令集来 协调的不同权限等级。有一个称之为虚拟机监视器(VMM)的特殊模块运行在最高权限等级上, 设置陷门(t即)来捕捉企图访问物理内存或者输入输出接口的特权指令,并仿真这些指令的执行。 溜客安全网WwW.I76Ku.CoM
黑客反汇编揭秘(第二版) 因而,非特权指令可以运行在“实况”(Iie)硬件上而不损失执行速度。由于特权指令所占的比率 相当低,因此,用于仿真上的开销是可以忽略的。 在当时可用的所有机器当中,只有IBM System/370与Motorola MC68020可以满足前面所述的 支持虚拟内存等性能要求。因此,专门为这两个平台开发了高效率的仿真器。这些仿真器创建虚拟 服务器,用于处理来自不同用户的请求或者简单地将服务器进行彼此复制.如果一台服务器崩溃了, 它的拷贝会立即接管所承担的任务。这意味着,为确保无故障的高品质服务,配置多个物理服务器 是没有必要的(不考虑服务器的物理硬件故障,因为操作系统出现崩溃的几率比硬件发生故障的机 会要高许多)。 Intel80386系列处理器是怎样的一种情况呢?它们支持虚拟内存,并拥有权限等级截然不同的 四个保护环。可不可以为这个平台实现一个全能的仿真器,就像为BM System/370实现的仿真器 一样?很遗憾,做不到。“Big Iron(大型服务器)”之所以具有如此不菲的价值,乃是因为经过精 心设计的缘故。首先,所有针对BMPC编写的操作系统将内核放在0环内,特权命令的概念并没 有扩展到这里。结果是,VMM不能设置陷门来捕获特权命令。 不过,有一种脱困办法。即安装某个操作系统,将该操作系统声明为主系统,并且将所有其他 操作系统运行在3环。在这种情况下,特权指令会激起异常,运行在0环的VMM可以轻易将这些 异常地捕获到。 然而,即使在这种情况下,一切也并非是轻而易举的。比如,指令LGDT、LLDT与工IDT分 别将指向全局段表、局部段表与中断描述符表的指针加载到CPU的内部寄存器,这些指令就不便 于同时用于几个操作系统。原因在于,描述符表是单一的。段描述符表存放着每个段的线性地址和 属性,并且,描述符是加载到诸如CS、DS与SS之类的寄存器的16位的数。中断描述符表的情 况也一样。客操作系统不能使用主操作系统的描述符表,因为段寄存器的选择符在操作系统的范围 内是经过硬编码的。这意味着,Windows将23h选择符加载到Ds寄存器时,其他操作系统会做 什么是未知的。 出路有一条,那就是为每台虚拟机创建各自的描述符表拷贝,并在切换虚拟机时相应地切换描 述符表。这样做的开销是相当可观的。此外,诸如SGDT/SLDT与SIDT之类的读取处理器内置寄 存器值的指令,并不是特权指令,结果造成客操作系统读取主操作系统的描述符表而不是它自己的 描述符表。对于读取处理器指令字的值的SMSW指令来说,情况也是这样。它含有客操作系统肯 定看不到的CR0寄存器的比特值。 POPF/POPFD指令将EFLAGS寄存器的内容保存在内存中而不产生异常。尽管修改EFLAGS 特权字段会引起异常,但这不能解决什么问题。假定客操作系统将x值保存在EFLAGS中,并且 该值会影响一至多个特权字段。那么,处理器会产生一个异常,仿真器捕捉到这个异常并模仿写操 作,从而将虚拟EFLAGS送进了客操作系统。不过,读EFLAGS不是一条特权指令,因此,它返 回的是没有经过修改的EFLAGS值。这样一来,客操作系统接收的就不是所希望的值。 对于LAR、工SL、VERR与VERW等指令来说,情况会更糟糕一些,因为它们在特权态与非 特权态下的工作方式不同。在非特权态下,虽然不引起异常,但是这类指令返回的却不是所希望 DG 的结果。 在这里只简要地列举x86平台并不适合进行高效虚拟化操作的原因。有关这个主题的更多细节 26 溜客安全网WwW.I76Ku.CoM
第3章调试器与仿真器的仿真 可在“第九届USENIX安全专题讨论会会议录(Proceedings of the9 h USENIX Security Symposium).” 的文章中找到,网站地址为http:lwww.usenix.org/events/.sec2000/robin.html。 虽然如此,x86体系结构对于高效虚拟操作的非适用性,并不意味着不能以程序方式来仿真只 提供最低限度的设备支持的BMPC。在最粗略的近似当中,这样的仿真器可以只是一个解释器, 通过进一步仿真机器指令来“碾磨”机器指令。这样做虽然不会给8086带来任何问题,不过,针 对分页内存以及其他386+平台典型特征的仿真,极大地复杂化了编码过程而使程序性能降低了数 百乃至数千倍。 3.2.1仿真器的应用范围 尽管仿真器具有前几节所描述的那些不足之处,人们对各种类型的仿真器的兴趣却一直有增无 减。出现这种情况的原因有很多。比如,研究网络安全的专业人员手边至少应该有如下三种操作系 统:Windows NT系列的某个产品、一个Linux系统与一个FreeBSD系统。当然,备有市场上的 其他一些领军操作系统产品是再好不过的事情。许多缺陷(特别是溢出错误)只是在特定的操作系 统版本中表现出来,而在同一操作系统的其他版本中则不会存在。不过,总是重装自己已经熟悉的 操作系统会很不方便。重装操作系统除了可怕的时间损失(而时间总是在与我们赛跑)之外,还潜 藏着丢失已收集的所有数据的风险! 此外,针对溢出进行崩溃测试是将文件系统弄乱的最快途径。由于丢失的数据可以部分或者完 全恢复,因此你必须这样做,以便获得消除破坏性结果的经验。像“Norton Disk Destroyer'”所做 的那种空洞的科研,没有太多的意义。因为这个原因,黑客必须事先将文件系统转储到另外一个硬 盘上,再破坏文件系统,而后使系统起死回生。 针对病毒和攻击(exploit)程序所做的实验必须在一台与外部世界隔绝的独立计算机上进行。 这是因为内置在诸如Windows NT系列与UNIX克隆版之类的操作系统中的本机访问控制系统, 非常不完善。因此,研究人员的任何疏忽大意经常会造成对系统的破坏。 解决这些问题的传统做法是,购买多台计算机或者多个硬盘,将它们依次连接到被测计算机上。 第一种方案购买多台计算机显得太昂贵。第二种方案则很不方便,硬盘驱动器在这种处理下很少 能够继续可用,而且每次震动冲击都会出现坏扇区,特别不方便。 从这个意义上讲,所有人都会认同计算机仿真器是一个了不起的工具。不管你从事什么性质的 工作一高级用户、管理员、程序员,乃至咄咄逼人的黑客一仿真器于你都会有所帮助。唯 的问题就是,在什么时候使用仿真器与怎样使用仿真器。本章的目的不在于推销任何一种特定仿 真器。相反,所要描述的是使用仿真器能做些什么以及如何恰当地使用它们。根据自己的需要选 择最合适的仿真器,那是用户自己要做的事情。 口一般用户使用的仿真器 设想一下下面的情形,随手翻开一本计算机杂志,不经意地看到了某个奇特的游戏软件。而后, 你迫不及待地买回它,满心欢喜地安装到计算机上,可是突然发现该软件在自己安装的操作系统下 是不能运行的。这会是一件多么令人失望的事情!FreeBSD用户就处在一种最不利的位置,因为很 少有可以在这种操作系统下运行的游戏软件。那么,如何应付这种棘手的局面呢?是的,这类用户 的硬盘上有安装Windows操作系统的空间,不过每次想玩游戏时都要重启系统一不过我绝不会 27 溜客安全网WwW.I76Ku.CoM
黑客反江编揭秘(第二版) 这么干的! 如果这是一款Mac平台或者Sony PlayStation游戏软件又当如何?幸运的是,现代计算机可以 让用户忘却“本机”硬件而去仿真整个计算机(如图3.1所示),于是,一个更加宽广的软件世界 跃然眼前。用户不会被一个特定的平台捆住手脚,相反,可以启动任何一个程序而不用管它是为哪 种机器写的一从ZX Spectrum游戏到Xbox微软家用游戏。现在,剩下的唯一问题就是找到高质 量的仿真器。 每 6w也8鱼d6出m”o■ 图3】使用什么操作系统无关紧要,要紧的是仿真器 对于仿真来说,主操作系统成为许多客操作系统的基础。在这样的“宾馆”里面,必须辟出 间房间来作为隔离场所之用。众所周知,用户在安装新的程序时,由于安装程序存在不当操作,库 文件之间有冲突,存在恶意广告软件或者说就是运气差等缘故,总是存在遗弃操作系统的风险。我 给出的建议是,尽可能将来路不那么可靠的程序与其他程序隔离开。要做到这一点,只需在仿真器 上给不可靠程序分配一个单独的虚拟机就可以了,这些程序要挣脱虚拟机的控制会很难。 口管理员使用的仿真器 从计算机管理员的角度看,仿真器主要是为做各种各样的实验而提供的测试场所。作为一名管 理员,可以安装十几个UX并对它们用尽一切测试手段。可以先安装操作系统,然后删除这个操 作系统,只在配置上进行些微的改变,再重新安装这个操作系统。这样做是获得经验的一条关键路 径。要使自己能够以计算机管理员的工作身份实现就业,不仅要拥有文凭,而且要成为领域内的专 家,这样的资质只能通过实践经验来获得。数据恢复的情况也差不多。要是没有精心的准备,并不 提倡你在自己的主机上运行Disk Editor(磁盘编辑器),特别注意不要启动Disk Doctor(磁盘修复 工具)。因为不能保证这些工具软件修复磁盘故障而不把磁盘搞癱掉。如此说来,仿真器真不愧是 DG 一个优良的实验测试场所,是一个曾几何时还遥不可及的梦(如图3.2所示)。 28 溜客安全网WwW.I76Ku.CoM
第3章调试器与仿真器的仿真 Bochs lor Windows-Dapla 直直简以δ Yes Ng anc■ Directories Processed:1 图3.2仿真器是训练恢复受损文件系统技能的试验场所 在大型机构任职的计算机管理员,总是拥有一台镜像服务器,用于在安装补丁软件之前对其进 行测试。小型单位可能无力承担另外单独购买一台专做测试工作的机器的费用。这时,仿真器就可 以派上用场了。此外,仿真器还可以用于试验各种不同的嗅探程序。一旦发现有漏洞,就立即采取 措施来消除潜在的错误。 有主操作系统的虚拟机与其他虚拟机之间的交互,通常是通过局域网(LAN)(也是虚拟的) 来完成的。假设机器有512-1024MB的RAM,就可以创建一个企业内联网的工作模式,使之具 有自己的结构化查询语言SQL与Wb服务器,即一个内部畅通无阻的“非军事化管理区”、一个 防火墙与多个工作站(如图33所示)。这样一个完整的试验场所,很容易在一台家用计算机上建 立起来。换句话说,再也没有什么比这更为价廉物美的测试装备了。这样一个网络,既可用于攻击 实践,也可以开展管理实践。 192.168.40.57 192.168.32128 etwork192.168.32.C NetBSD M 192168402 192.168.40.32 192168:80.2 192.168.1202 192.168.120.15 Linux 192.168.80.128 FreeBSD 192.16880.0 19276800254 PDG 图33虚拟网络实例 29 溜客安全网WwW.I76Ku.CoM