0day安全
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 必备工具

1.3.1 OllyDbg简介

Ollydbg是一个集成了反汇编分析、十六进制编辑、动态调试等多种功能于一身的功能强大的调试器。它安装简单,甚至不需要点击安装文件就能直接运行;它扩展性强,您甚至可以为自己写出有特殊用途的插件;它简单易用,初学者只需要知道几个快捷键就能立刻上手……Olldbg的优点实在是数不胜数,现在已经成为主流调试器之一。

与SoftICE和WinDbg相比,Ollydbg虽然无法调试内核,但其人性化的GUI界面省去了初学者往往望而却步的调试命令,您需要的只是掌握五六个快捷键,然后用鼠标click,click,click……。

OllyDbg并非浪得虚名,在用户态调试中,真的只要有它“only one”,就可以走遍天下都不怕了。它的主功能界面在默认情况下分为5个部分,让您在调试过程中轻松掌握指令、内存、栈、寄存器等重要信息。除此以外,如果您是习惯于在SoftICE和WinDbg上敲调试命令的程序员,OllyDbg也体贴地为您保留了调试命令的debug方式。

这里只介绍6个最基本的功能快捷键,知道它们就可以基本用起这个调试器了,如表1-3-1所示。

表1-3-1 基本功能快捷键

其调试界面如图1.3.1所示。

本书中绝大部分调试实验都将使用OllyDbg,您会在后面章节中频繁见到这个调试器。相信您在跟随我们完成几个调试实验之后,一定会对这款调试器有一个较深层次的掌握,甚至爱不释手。

OllyDbg博大精深,其内存断点、内存跟踪(trace)、条件断点和众多插件的功能将在后续章节中陆续进行介绍。

1.3.2 SoftICE简介

SoftICE可能是最德高望重的调试器了,它功能强大,工作在ring0级,因此可调试驱动等内核对象。

图1.3.1 OllyDbg调试界面简介

首先要说明一下“ICE”可不是英文单词“冰”的意思,而是“In Circuit Emulator”的缩写,即实体电路模拟器,简单说来就是用于截获CPU所有动作的一种设备。通常要做到彻底监视CPU的所有动作是需要硬件设施的,但SoftICE用软件方式实现了这一功能。不夸张地说,如果您懂得怎么用它,您就可以crack任何软件,甚至是操作系统。

但是由于SoftICE会暴力地中断所有进程,而且几乎所有功能都通过调试命令来运行,其易用性在很大程度上受到了OllyDbg的挑战。比如很多人喜欢听着音乐工作,但媒体播放器进程一样会被SoftICE中断。此外,由于SoftICE能够调试和修改很底层的东西,在使用过程中死机、蓝屏也是家常便饭。即便如此,还是有众多资深的调试员忠实地支持着SoftICE。

依以往的经验,如果调试ring3级的用户态进程,我们所推荐的首选调试器还是OllyDbg,方便也安全;但若调试ring0,命令就命令吧,反正想要调试内核的人都不是刚刚入行的菜鸟。

在Compuware NuMega公司把SoftICE打包进“Compuware SoftICE Driver Suite”驱动开发套件之前,安装SoftICE并不是一件容易的事情,因为总是存在一些兼容性的问题,例如,鼠标异常、断点异常、显卡驱动不匹配导致显示不正常等。另外,有许多文献资料都建议在Windows 2000上安装SoftICE。

当Compuware SoftICE Driver Suite驱动套件出现后,SoftICE的安装问题似乎就变成了历史性话题。我们可以轻松地在Windows XP上安装并设置SoftICE。我目前使用的就是Compuware SoftICE Driver SuiteRelease 2.7。

题外话:SoftICE被呼出时会独占CPU,中断一切进程和消息。例如,随着调试的进行,您会发现Windows桌面右下角的时间开始出现偏差,因为时钟也被中断了。由于Windows的截图热键“print screen”和其他的截图软件都会被中断,如果不用虚拟机,要获得一张SoftICE的运行截图着实要花一番工夫。甚至在一些文献中有人用数码相机拍下SoftICE运行界面。

图1.3.2是安装好后默认的SoftICE界面,包括了常用的寄存器信息、反汇编信息和命令执行情况等。

图1.3.2 SoftICE 调试界面

默认的SoftICE界面很小,字体和显示行数看起来都不是很舒服,通常需要进一步设置才能顺手地使用。SoftICE有一套设置窗口属性的命令用来自定义工作界面。

从开始菜单中找到“Compuware SoftICE Driver Suite”下SoftICE的“Settings”,打开后如图1.3.3所示。在这里输入界面设置命令

图1.3.3 SoftICE配置界面

选择“General”,可以看到在默认安装的情况下,SoftICE的初始化命令只有一条:X。在“Initialization”编辑框中输入如下命令:

Faults off;set font 2; lines 44 ; data 3;dd; dex 3 ss:esp ; data 0 ; wc 20 ;code on ; X ;

这样,调试界面就变得比较顺眼了。这串初始化命令的含义如表1-3-2所示。

表1-3-2 初始化命令的含义

在调试时,首先选择从开始菜单中通过“Start SoftICE”启动批处理文件“ntice.bat”,运行SoftICE,然后通过开始菜单中的“Symbol Loader”启动装载界面,选择要装载运行的PE文件,最后单击“装载运行”按钮,运行程序,如图1.3.4所示。

图1.3.4 用SoftICE加载进程

程序运行起来后,用快捷键Ctrl+D即可激活SoftICE,调出调试界面。

SoftICE的调试命令非常多,这里作为入门性介绍,只给出几个最常用的命令让您上手。

(1)基础调试命令(如表1-3-3所示)

表1-3-3 基础调试命令

(2)信息查看与编辑命令(如表1-3-4所示)

表1-3-4 信息查看与编辑命令

命令虽然比较多,但实际上只要知道bp是下断点,d是显示数据(display),e是修改数据(edit),再记住三个单步的快捷键,以及用快捷键Ctrl+D在操作系统和SoftICE之间切换控制权,您就可以上手进行最简单的跟踪和调试了。

如果想深入学习,您可以在看雪学院(http://www.pediy.com/)找到SoftICE的命令手册和使用教程。

1.3.3 WinDbg简介

个人感觉,WinDbg的风格介于OllyDbg和SoftICE之间,是一款比较“温和”的调试器,其调试界面如图1.3.5所示。它可以调试内核,但却不像SoftICE那么暴力,总是中断操作系统;它保留了一部分Visual Studio中常用的快捷按钮,也保留了和SoftICE一样丰富的调试命令。从功能上讲,它可以设置异常复杂的断点条件逻辑,在这一点上丝毫不比SoftICE和OllyDbg逊色。

从WinDbg功能界面上那些熟悉的调试快捷按钮上很容易找到Visual Studio 6.0的影子。比起OllyDbg绚丽的GUI界面,一些初学者不喜欢它稍显干瘪的界面和繁多的调试命令。然而由于“师出微软嫡系”,WinDbg更像是一个正规的调试器,因此其“粉丝团”大多集中于“规规矩矩”的程序员。

WinDbg的主要功能都是靠调试命令来完成的,而且这些命令很大程度上和SoftICE所使用的调试命令类似。这里给出一些最常用的命令。这些命令大多是英文单词的缩写,所以结合单词的含义更容易被掌握。

图1.3.5 WinDbg调试界面

调试功能的命令如表1-3-5所示。

表1-3-5 调试功能的命令

信息显示与编辑功能如表1-3-6所示。

表1-3-6 信息显示与编辑功能

本书在讲解第4篇中关于内核安全及调试的部分将主要以WinDbg调试为主,更多的WinDbg调试技巧请参阅第4篇相关内容。

1.3.4 IDA Pro简介

IDA Pro无疑是当今最强大的反汇编软件,其工作界面如图1.3.6所示。虽然目前的IDA版本也可以做一些简单的动态调试工作,但大多数情况下我们主要使用它的静态反汇编功能。

很多工具都能把二进制的机器代码翻译成汇编指令,但为什么提起反汇编工具,IDA永远都是首屈一指的强者呢?这是因为IDA拥有强大的标注功能。

图1.3.6 IDA工作界面

即使是对汇编语言非常精通的程序员,也无法直接阅读成千上万行汇编指令。我们需要把庞大的汇编指令序列分割成不同层次的单元、模块、函数,对其逐个研究,最终摸清楚整个二进制文件的功能。

所谓逆向的过程,在很大程度上就是对这些代码单元的标注。每当我们弄清楚一个函数的功能时,我们就会给这个函数起一个名字。使用IDA对函数进行标注和注解可以做到全文交叉引用,也就是说,标注一个常用函数后,整个程序对这个函数的调用都会被替换成我们所标注的名字,这可比直接对内存地址的调用形式好理解多了(通常情况下,反汇编得到的函数调用往往都是对内存地址的调用)。

对汇编代码的标注可以自上而下进行,也可以自下而上进行。自上而下是指从main函数开始标注,相当于对函数调用图从树根开始遍历;自下而上逆向是指从比较底层的经常被调用的子函数开始标注,每标注一个这样的底层函数,代码单元的可读性就会增加许多,当最终标注到main函数时,整个程序的功能和流程就基本上可以掌握了。大多数情况下,我们会从两个方向同时开始逆向。

除了在人工标注时IDA提供了交叉引用、快速链接等功能外,IDA的自动识别和标注功能也是最优秀的。目前的IDA版本能够自动标注VC、Borland C、Delphi、Turbo C等常见编译器中的标准库函数。试想一下,在反汇编的结果中发现所有的memcpy、printf函数都已经被自动标注好的时候是什么感觉。

IDA好像是一张二进制的地图,通过它的标注功能可以迅速掌握大量汇编代码的架构,不至于在繁杂的二进制迷宫中迷失方向。目前版本的IDA甚至可以用图形方式显示出一个函数内部的执行流程。在反汇编界面中按空格键就可以在汇编代码和图形显示间切换,如图1.3.7所示。

图1.3.7 IDA的图形显示界面

IDA的扩展性非常好,除了可以用IDA提供的API接口和IDC脚本扩展它自身外,IDA还可以把标注好的函数名、注释等导入OllyDbg,让我们在动态调试的时候也不会晕。如果把IDA自身的标注比做纸质地图,那么这个功能就相当于车载GPS的电子地图了。

这里给出几个IDA中常用的快捷键命令,如表1-3-7所示。

表1-3-7 常用的快捷键命令

知道这几个快捷键,您就可以自行去标注汇编代码了。彻底掌握IDA不是一两天就能做到的,由于在漏洞利用中我们主要使用的是动态调试工具,所以IDA的许多高级特性(如编写IDC脚本等)本书暂不介绍。如果在漏洞分析时需要进行静态反汇编,本书会结合案例给予适当补充。

1.3.5 二进制编辑器

漏洞调试总是需要和二进制打交道。一款方便易用的十六进制编辑软件可以让您打开任意的二进制文件,方便地跳到某处偏移,查看或修改那里的机器代码。

比较著名的十六进制编辑器包括UltraEdit、Hex Workshop和WinHex和010 editor。

UltraEdit的功能如图1.3.8所示,这是9.0版本的界面。您可以用它以二进制形式轻易地打开任何文件并进行编辑、查找、替换等操作。用它可以方便地完成机器代码的修改或者shellcode的编辑。

图1.3.8 UltraEdit编辑界面

二进制编辑只是UltraEdit的一项功能。正如它的名字,这是一个超级编辑器,它还可以作为几乎所有常见编程语言的编辑器。例如,在打开扩展名为C的文件时,它将提供C语言中的关键字、语法标注、函数识别等功能,有些功能甚至比微软SDK中的文本编辑器还方便。

Hex Workshop是一款和UltraEdit类似的十六进制编辑软件,只是它更关注于二进制本身,其编辑界面如图1.3.9所示。它可以方便地进行十六进制编辑、插入、填充、删除、剪切、复制和粘贴工作,配合查找、替换、比较、计算校验和等命令使工作更加快捷,并附带计算器和转换器工具。

图1.3.9 Hex Workshop编辑界面

WinHex与上述两款十六进制编辑软件相比,有一个更加强大的特性,就是可以允许您透过文件系统直接对磁盘的扇区、簇进行操作。专业的数据恢复专家更喜欢使用这种工具,它的界面如图1.3.10所示。

除此以外,有些人还会偏好没有GUI界面的H-viwe等工具。不管什么工具,只要根据您的个人喜好拥有其中之一就行。本书中将始终使用UltraEdit作为十六进制文本编辑器。

除以上几款二进制编辑器之外,在分析具有复杂数据结构的文件时,我们往往会采用010 editor。这个二进制编辑器与传统编辑器有很大不同,它支持解析脚本的运行,可以将复杂的文件格式中有意义的数据结构注意提取出来。我们将在第17章讨论复杂文件格式的时候详细介绍010 editor下的文件解析与脚本编程。

1.3.6 VMware简介

在研究Windows漏洞时,我们往往要实验Windows 2000、Windows XP、 Windows 2003、Windows vista、Windows 7等多种平台,有时还要对比补丁前后系统的变化。如果为每套操作系统、每款补丁都分配一台计算机的话这将是一件非常烧钱的事,而虚拟机的出现将解决这个问题。

图1.3.10 WinHex编辑界面

与平时所说的Java虚拟机不同,这里所说的虚拟机是指通过软件来模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件,您可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如您可以安装操作系统、安装应用程序、访问网络资源等等。对于您而言,它只是运行在物理计算机上的一个应用程序,但是对于在虚拟机中运行的应用程序而言,它就像是在真正的计算机中进行工作。

除了节约资金外,虚拟机还有以下两点优势让安全工作者们不忍抛弃。

(1)虚拟机具有出色的快照功能。我们可以通过创建快照,可以将虚拟机中的操作系统快速的恢复到某一状态。例如,调试病毒样本后,需要将操作系统恢复到干净的状态;Patch过补丁后,又希望把系统恢复到有漏洞的状态等。

(2)可以防止漏洞分析中对操作系统和资料的破坏。由于漏洞测试过程是在虚拟机当中进行的,绝大多数的情况下不会对宿主机产生影响。

在Windows系统下,目前流行的虚拟机软件有VMware和Virtual PC,它们都能在Windows系统上虚拟出多个计算机,用于安装Linux、OS/2、FreeBSD等其他操作系统。本书将使用VMware作为虚拟机软件,接下来我们来看看VMware的使用方法。

这里演示安装的是VMware 6.5.3版本,软件的安装过程与一般的应用软件安装没有什么区别,输入正确序列号后就可以使用。其使用界面如图1.3.11所示。

图1.3.11 VMware的使用界面

用鼠标选择图标,会出现VMware新建虚拟机向导,如图1.3.12的画面。

图1.3.12 新建虚拟机类型选择画面

VMware首先会让您选择要建立什么类型的虚拟机,“Typical”指的是传统硬件环境的虚拟机,也就是一般使用的基于Intel x86结构的计算机系统,这也是VMware所推荐的虚拟机系统安装环境。“Custom”是用来建立有特殊硬件结构需要的虚拟机,例如建立支持SCSI控制器的虚拟机系统环境,您可以理解“Custom”类型属于高级配置模式,一般情况下,我们选择“Typical”来建立虚拟机环境。单击“Next”按钮后,如图1.3.13所示。

图1.3.13 选择预安装操作系统来源

利用VMware安装操作系统首先第一步就是选择操作系统源文件的来源,VMware支持传统的利用光驱安装操作系统,同时也支持利用光盘镜像文件iso来安装操作系统。我们这里选择使用iso文件作为安装操作系统的来源之后,单击“Next”按钮,如果虚拟机能够自动识别要安装的操作系统就会显示图1.3.16的界面,如果虚拟机不能够自动识别要安装的操作系统,就会显示图1.3.14的界面。

图1.3.14 选择预安装操作系统类型

当VMware不能够自动识别要安装的系统时,我们需要手工选择要安装的操作系统类型。VMware支持Windows、Linux、Novell NetWare、Sun Solaris等操作系统。同时,VMware还对每一种类型的操作系统有着更加具体的支持,如图1.3.15所示。

图1.3.15 选择操作系统具体版本

在图1.3.15的下拉列表中选择好我们即将安装的具体操作系统版本型号后(这里选择的是微软的Windows XP Professional操作系统),单击“Next”按钮,如图1.3.16所示。

图1.3.16 填写待安装操作系统序列号以及管理员密码

新版本的VMware比较以前VMware 5的版本在细节方面有了较大改变,在安装操作系统之前提供了设置待安装操作系统序列号和设置管理员用户密码的功能,这样做的目的是为了能够完成自动化操作系统安装,不需要人工干预。设置完毕后,单击“Next”按钮,进入下一步设置,如图1.3.17所示。

图1.3.17 设置虚拟机操作系统保存路径

图1.3.17将设置虚拟机操作系统的文件保存位置以及新虚拟机的名字,此时要注意选择的虚拟机文件保存位置一定要有足够的硬盘空间,根据所安装的操作系统不一样,VMware虚拟机需要的保存空间也不一样,对于像Windows XP Professional这样的系统来说保存空间最好保持在40GB大小。对于新虚拟机名则可以不做修改,单击“Next”按钮,如图1.3.18所示。

图1.3.18 设置虚拟机操作系统文件及磁盘大小

图1.3.18这里主要设置虚拟机操作系统磁盘大小和文件保存类型,这里不需要做任何修改,直接单击“Next”按钮即可,如图1.3.19所示。

这一步显示的是虚拟机配置完成信息,直接单击“Finish”按钮,VMware将开始安装自动操作系统了,如图1.3.20所示。

图1.3.19 设置完成画面

图1.3.20 开始安装操作系统

等待VMware操作系统安装完毕后,我们需要注意给新的虚拟机安装上VMware Tools,只有安装了VMware Tools之后,我们才可以让虚拟机与真实主机进行通信。安装VMware Tools的方法是选择“VM”菜单中的“Install VMware Tools”选项即可,如图1.3.21所示。

图1.3.21 安装VMware Tools

题外话:从安全技术的角度,电影Matrix(黑客帝国)中描述的故事就有点像在虚拟机中调试病毒时的情景:正常的程序安静地运行在虚拟机中;少数像Neo这样的有“特权”的程序可以做许多出格的事,甚至跳出虚拟机进入宿主机(锡安)运行;电影第二部结束时,Neo在“真正的操作系统”锡安中也能使用特权指令——用意念消灭乌贼机器人,原来这个所谓的“真正的操作系统”也只是更高一层的虚拟;Agent也是一类特殊的进程,它们有一种特权,就是使用Hook函数注入到任意一个ring3级进程中去;由于Smith作为特权进程对Matrix的背叛,导致几乎所有的进程都被他感染;电影第三部末尾Matrix面临崩溃,Neo牺牲自己帮助Matrix定位到Smith,也就是病毒进程的PID,之后通过一轮内存杀毒和重启虚拟机等操作,使Matrix重新恢复到“比较正常”的状态。

1.3.7 Python编程环境

Python语言的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。

Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。著名的自由软件作者Eric Raymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的四种编程语言之一,并建议人们从Python开始学习编程。这的确是一个中肯的建议,回顾过去5年内出现的那些著名的安全工具(Sulley fuzz、Paimei、Peach fuzz等),几乎全部使用Python开发。

在漏洞挖掘的过程中,经常需要迅速地开发出具有针对性的小工具,诸如:特定的解析器,数据包变异器,文件变异器等等。使用Python能把编程环节耗费的精力降到很低,让您更迅速地面对真正需要关心的东西,而不是纠缠于指针或数据结构的细节。

Python对应的SDK有很多,个人而言,我最偏好于Eclipse+PyDev的组合。如图1.3.22所示,Eclipse提供了编程必须的谓词识别、函数识别、语法高亮等功能,配合PyDev插件后能够方便的开发出相当规模的Python工程。

图1.3.22 Eclipse+PyDev 开发环境

通常情况下,有程序基础的人能够在几个小时内掌握Python的基本用法,进行简单的开发工作。除C和C++语言外,本书中许多小工具和测试代码也将用Python来实现。