导读:
看到有些朋友从贴图上的title上已经发现,我正在编纂一本漏洞分析方面的技术书籍。
目前这本书正处于最后的排版,校对阶段,估计春节期间能够上架,有兴趣的朋友不妨到时候捧个场。另外觉得合胃口了记得向朋友推荐啊~~~~~(有点广告的嫌疑,呵呵)
由于这两周项目很紧张,书也处于最后阶段,因此本系列讲座可能会调整到2~3天一帖。
今天晚上的讲座我偷个懒,把我的书的目录公布一下,这个目录在一定程度上也是漏洞学习的一个大纲。通过这个知识框架,我们能够比较系统的对这门技术有一个整体的了解。
其实这个系列的讲座也基本上是从书中的相关章节中摘取出来,稍加修改后贴出来的。
后面我们的讲座中还会涉及shellcode技术,metasploit编程,以及部分实际案例调试章节中的一些内容。
在本讲座结束的时候,我会把讲座涉及的内容和书中的相关样章做成PDF在论坛上发布。希望大家多提意见,多给反馈。
自序
不请长缨,系取天骄种,剑吼西风
——《六州歌头》北宋,贺铸
虽然事隔多年,我仍然清晰记得自己被“冲击波”愚弄的场景——2003年夏的那个晚上,自己像往常一样打开实验室的计算机,一边嘲笑着旁边同学因为不装防火墙而被提示系统将在一分钟内关机,一边非常讽刺地在自己的计算机上发现了同样的提示对话框。正是这个闻名世界的“框框”,坚定了我投身网络安全研究的信念,而漏洞分析与利用正是这个领域的灵魂所在。
漏洞分析与利用的过程是充满艺术感的。想象一下,剥掉windows中那些经过层层封装的神秘的对话框“外衣”,面对着浩如烟海的二进制机器码,跋涉于内存中不知所云的海量数据,在没有任何技术文档可以参考的情况下,进行反汇编并调试,把握函数调用和参数传递的细节,猜测程序的设计思路,设置巧妙的断点并精确定位到几行有逻辑缺陷的代码,分析研究怎么去触发这个逻辑漏洞,最后编写出天才的渗透代码从而得到系统的控制权……这些分析过程的每一个环节无不散发着充满智慧的艺术美感!这种技术不同于其他计算机技术,它的进入门槛很高,需要拥有丰富的计算机底层知识、精湛的软件调试技术、非凡的逻辑分析能力,还要加上一点点创造性的思维以及可遇而不可求的运气。
在无数个钻研这些技术的夜里,我深深地感觉到国内漏洞分析资料和文献是多么的匮乏。为了真正搞清楚蠕虫病毒是怎样利用windows漏洞精确淹没EIP寄存器并获得进程控制权,我仍然记得自己不得不游走于各种论坛收集高手们零散手稿时的情形。那时的我多么希望能有一本教材式的书籍,让我读了之后比较全面、系统地了解这个领域。
我想,在同样漆黑的夜里,肯定还有无数朋友和我从前一样,满腔热情地想学习这门技术而又困惑于无从下手。正是这种“请缨无处,剑吼西风”的感觉,激励着我把自己钻研的心血凝结成一本教程,希望这样一本教程可以帮助喜欢网络安全的朋友们在学习时绕开我曾走过的弯路。
failwest
2007年11月1日
前言
关于安全技术人才
国内外对网络安全技术人才的需求量很大,精通缓冲区溢出攻击的安全专家可以在大型软件公司轻易的获得高薪的安全咨询职位。
信息安全技术是一个对技术性要求极高的领域,除了扎实的计算机理论基础外、更重要的是优秀的动手实践能力。在我看来,不懂二进制就无从谈起安全技术。
国内近年来对网络安全的重视程度正在逐渐增加,许多高校相继成立了“信息安全学院”或者设立“网络安全专业”。科班出身的学生往往具有扎实的理论基础,他们通晓密码学知识、知道PKI体系架构,但要谈到如何真刀实枪的分析病毒样本、如何拿掉PE上复杂的保护壳、如何在二进制文件中定位漏洞、如何对软件实施有效的攻击测试……能够做到的人并不多。
虽然每年有大量的网络安全技术人才从高校涌入人力市场,真正能够满足用人单位需求的却聊聊无几。捧着书本去做应急响应和风险评估是滥竽充数的作法,社会需要的是能够为客户切实解决安全风险的技术精英,而不是满腹教条的阔论者。
我所认识的很多资深安全专家都并非科班出身,他们有的学医、有的学文、有的根本没有学历和文凭,但他们却技术精湛,充满自信。
这个行业属于有兴趣、够执着的人,属于为了梦想能够不懈努力的意志坚定者。
关于“Impossible” 与“I’m possible”
从拼写上看,“Impossible”与“I’m possible”仅仅相差一个用于缩写的撇号(apostrophe)。学完本书之后,您会发现将“不可能(Impossible)”变为“可能(I’m possible)”的“关键(key point)”往往就是那么简单的几个字节,本书将要讨论的就是在什么位置画上这一撇!
从语法上看,“Impossible”是一个单词,属于数据的范畴;“I’m possible”是一个句子,含有动词(算符),可以看成是代码的范畴。学完本书之后,您会明白现代攻击技术的精髓就是混淆数据和代码的界限,让系统错误的把数据当作代码去执行。
从意义上看,To be the apostrophe which changed “Impossible” into “I’m possible” 代表着人类挑战自我的精神,代表着对理想执着的追求,代表着对事业全情的投入,代表着敢于直面惨淡人生的豪情……而这一切正好是黑客精神的完美诠释——还记得在电影“Sword Fish(剑鱼行动)”中,Stan在那台酷毙的计算机前坚定的说:“Nothing is impossible”,然后开始在使用Vernam加密算法和512位密钥加密的网络上,挑战蠕虫的经典镜头么?
于是我在以前所发表过的所有文章,代码中都加入了这个句子,甚至用它作为自己的签名档。
尽管我的英语老师和不少外国朋友提醒我,说这个句子带有强烈的“Chinglish”味道,甚至会引起Native Speaker的误解,然而我最终还是决定把它写进书里。
虽然我不是莎士比亚那样的文豪,可以创造语言,发明修辞,用文字撞击人们的心灵,但这句“Chinglish”的确能把我所要表达的含义精确的传递给中国人,这已足够。
关于本书
通常情况下,利用缓冲区溢出漏洞需要深入了解计算机系统,精通汇编语言乃至二进制的机器代码,这足以使大多数技术爱好者望而却步。
随着时间的推移,缓冲区溢出攻击在漏洞的挖掘、分析、调试、利用等环节上已经形成了一套完整的体系。伴随着调试技术和逆向工程的发展,Windows平台下涌现出的众多功能强大的debug工具和反汇编分析软件逐渐让二进制世界和操作系统变得不再神秘,这有力的推动了windows平台下缓冲区溢出的研究。 除此以外,近年来甚至出现了基于架构(Frame Work)的漏洞利用程序开发平台,让这项技术的进入门槛大大降低,使得原本高不可攀的黑客技术变得不再遥不可及。
遗憾的是,与国外飞速发展的高级黑客技术相比,目前国内还没有系统介绍windows平台下缓冲区溢出漏洞利用技术的专业书籍,而且相关的中文文献资料也非常匮乏。
本书将系统全面的介绍windows平台软件缓冲区溢出漏洞的发现,检测,分析,以及利用等方面的知识。
为了保证这些技术能够被读者轻松理解并掌握,本书在叙述中尽量避免枯燥乏味的大段理论阐述和代码粘贴。概念只有在实践中运用后才能真正被掌握,这是我多年来求学生涯的深刻体会。书中所有概念和方法都会在紧随其后的调试实验中被再次解释,实验和案例是本书的精髓所在。从为了阐述概念而精心自制的漏洞程序调试实验到现实中已经造成很大影响的著名漏洞分析,每一个调试实验都有着不同的技术侧重点,每一个漏洞利用都有自己的独到之处。
我将带领您一步一步地完成调试的每一步,并在这个过程中逐步解释漏洞分析思路。不管您是网络安全从业人员、黑客技术发烧友、网络安全专业的研究生或本科生,如果您能够完成这些分析实验,相信您的软件调试技术、对操作系统底层的理解等计算机能力一定会得到一次质的飞跃,并能够对安全技术有一个比较深入的认识。
内容导读
本书分为4篇,共17章。
第一篇 基础知识
第1章 漏洞概述
简介漏洞研究中的一些基础概念和原理
第2章 二进制文件概述
不管是漏洞挖掘,漏洞分析还是漏洞利用,我们所面对的都是二进制、机器码、内存地址。第2章将简单介绍windows平台下可执行文件的结构和内存方面的一些基础知识。PE文件和虚拟内存的细节枯燥乏味,长篇累牍的介绍很容易让人失去学习的兴趣和激情。但在进行静态反汇编和动态调试的过程中,如果没有PE和虚拟内存方面的基础知识,您甚至无法把反汇编的内容和正在执行的指令对应起来。根据漏洞分析利用的特点,这章给出了调试漏洞所必须的二进制基础知识。
第3章 必备工具
第3章介绍了一批漏洞分析与利用中经常使用的软件工具。包括调试工具、反汇编工具、二进制编辑工具等。您会在后面的调试实验中反复见到这些工具的身影。在这章的最后一节,我设计了一个非常简单的破解小实验,用于实践工具的应用,消除您对二进制的恐惧感,希望能够给您带来一些乐趣。
第二篇 漏洞利用
第4章 栈溢出利用
基于栈的溢出是最基础的漏洞利用方法。第4章首先用大量的示意图,深入浅出地讲述了操作系统中函数调用、系统栈操作等概念和原理;随后通过三个调试实验逐步讲解如何通过栈溢出,一步一步的劫持进程并植入可执行的机器代码。即使您没有任何汇编语言基础,从未进行过二进制级别的调试,在本章详细的实验指导下也能轻松完成实验,体会到exploit的乐趣。
第5章 开发shellcode的艺术
第5章紧接第4章的讨论,比较系统的介绍了溢出发生后,如何布置缓冲区、如何定位shellcode、如何编写和调试shellcode等实际的问题。掌握这章的内容意味着您已经具备初步开发栈溢出利用程序的能力。第5章的最后两小节还给出了一些编写shellcode的高级技术,供有一定汇编基础的朋友参考。
第6章 堆溢出利用
在很长一段时间内,windows下的堆溢出被认为是不可利用的,然而事实并非如此。第6章将用精辟的论述点破堆溢出利用的原理,让您轻松领会堆溢出的精髓。此外,这章的一系列调试实验将加深您对概念和原理的理解。用通俗易懂的方式论述复杂的技术是本书始终坚持的原则。
第7章 windows异常处理机制深入浅出
对异常处理的利用是windows平台下缓冲区溢出漏洞利用的一大特点。第7章除了介绍如何在溢出发生时利用S.E.H外,还对windows异常处理机制做了较深入地剖析,供有一定基础的读者参考。
第8章 高级内存攻击技术
第8章集中介绍了一些曾发表于Black Hat上的著名论文中所提出的高级利用技术,这些思路往往能在高难度漏洞利用中给您以一定的启发。
第9章 揭秘windows安全机制
微软在Windows XP SP2和windows 2003之后,向操作系统中加入了许多安全机制。本章将集中讨论这些安全机制对漏洞利用的影响。
第10章 用metasploit开发exploit
MetaSploit是软件工程中的Frame Work(架构)在安全技术中的完美实现,它把模块化、继承性、封装等面向对象的特点在漏洞利用程序的开发中发挥的淋漓尽致。使用这个架构开发exploit要比直接使用C语言写出的exploit简单的多。第10章将集中介绍如何使用这个架构进行exploit开发,这也将是第一次在中文书籍中集中介绍MetaSploit通用漏洞测试平台。
第11章 其它漏洞利用技术
格式化串漏洞在windows平台上非常罕见,所以我把这种漏洞利用单独放在本章介绍。除此以外,由于脚本注入漏洞与缓冲区溢出漏洞的利用在技术上差异较大,故也被安排在这章。鉴于基于WEB的漏洞利用种目繁杂,且自成体系,本书目前只做了简单的介绍。如有机会,我将单独著书述之。
第三篇 漏洞分析
第12章 漏洞分析技术概述
第12章纵览了漏洞分析与调试的思路,并介绍了一些辅助漏洞调试分析的高级逆向工具。
第13章 MS06-040分析:系统入侵与蠕虫
通过对真实案例的分析,彻底揭秘攻击者入侵操作系统的全过程。在您获得操作系统控制权限的那一刻,相信伴随着强烈的成就感,之前所有付出的努力和艰辛都将涌上心头。
第14章 MS06-055分析:揭秘“网马”内幕
通过网页“挂马”是近年来攻击者惯用的手法。本章通过分析微软IE浏览器中真实的缓冲区溢出漏洞,告诉您为什么不能随便点击来历不明的RUL链接
第15章 MS07-060分析:Word文档中的阴谋
稍懂计算机知识的人都不会随便点击可执行文件,但是谁会想到打开Word文档也会导致shellcode的执行呢?如果office中存在漏洞,那么打开word文档就也有可能导致shellcode被执行。
第四篇 漏洞挖掘与产品安全
第16章 漏洞挖掘技术浅谈
不论从工程上讲还是从学术上讲,漏洞挖掘都是一个相当前沿的领域。本章将介绍一些目前比较流行的漏洞挖掘方法,并着重介绍Fuzz测试的方法。相信本章的内容对于QA工程师和软件测试人员也会有用。
第17章 安全的软件生命周期
要做到尽可能的避免软件中的安全漏洞,仅仅靠安全测试和漏洞挖掘是远远不够的,那需要在软件生命周期的各个环节中加入安全因素。
本书源代码及相关文档
本书中调试实验所涉及的所有源代码和PE文件都被收录在附带光盘中。
这些代码都经过了仔细调试,如在使用中发现问题,请查看实验指导中对实验环境的要求。个别攻击实验的代码可能会被部分杀毒软件鉴定为存在风险的文件,请您调试前详细阅读实验说明。
此外,“看雪论坛”相关版面可以找到更多本书中所涉及的资源。
对读者的要求
虽然溢出技术经常涉及汇编语言,但本书并不要求读者一定具备汇编语言的开发能力。所用到的指令和寄存器在相关的章节都有额外介绍,只要您有C语言基础就能消化本书的绝大部分内容。
我并不推荐在阅读本书之前先去系统的学习汇编知识和逆向知识,枯燥的寻址方式和指令介绍很容易让人失去学习的兴趣。本书将带您迅速跨过漏洞分析与利用技术的进入门槛。即使您并不懂汇编与二进制也能完成书中的调试实验,并获得一定的乐趣。当然,在您达到一定水平想进一步提高时,补习逆向知识和汇编语言将是绝对必要的。
本书适合的读者群体包括:
安全技术工作者 本书比较全面、系统地收录了windows平台下缓冲区溢出攻击所涉及的各种方法,将会是一本不错的技术字典。
信息安全理论研究者 本书中纰漏的许多漏洞利用、检测方法在学术上具有一定的前沿性,在一定程度上反映了目前国内外安全技术所关注的焦点问题。
QA工程师,软件测试人员 本书第四篇中集中介绍了产品安全性测试方面的知识,这些方法可以指导QA人员审计软件中的安全漏洞,增强软件的安全性,提高软件质量。
软件开发人员 知道漏洞利用原理将有利于编写出安全的代码。
高校信息安全专业的学生 本书将在一定程度上弥补高校教育与信息安全公司人才需求脱节的现象。用一套过硬的调试技术和逆向技术来武装自己可以让您在未来的求职道路上利于不败之地。精通exploit的人才可以轻松征服任何一家杀毒软件公司或安全资讯公司的求职门槛,获得高薪工作。
本科二年级以上计算机系学生 通过调试实验,你们将更加深入的了解计算机体系架构和操作系统。这些知识一样将成为您未来求职时过硬的敲门砖
所有黑客技术爱好者 如果您厌倦了网络嗅探、端口扫描之类的扫盲读物,您将在本书中学到实施有效攻击所必备的知识和技巧
反馈与提问
读者在阅读本书时如遇到任何问题,可以到看雪论坛相关版面提出或发送E-mail给我
目录
目录 12
第一篇 基础知识 18
第1章 漏洞概述 19
1.1 bug与漏洞 19
1.2 几个令人困惑的安全问题 19
1.3 漏洞挖掘、漏洞分析、漏洞利用 19
1.4 漏洞的公布与0day响应 19
第2章 二进制文件概述 19
2.1 PE文件格式 19
2.2 虚拟内存 19
2.3 PE文件与虚拟内存之间的映射 19
第3章 必备工具 20
3.1 OllyDbg简介 20
3.2 SoftICE简介 20
3.3 WinDbg 简介 20
3.4 IDA PRO简介 20
3.5 二进制编辑器 20
3.6 虚拟机简介 20
3.7 CRACK二进制文件 20
第二篇 漏洞利用 21
第4章 栈溢出利用 22
4.1 系统栈的工作原理 23
4.1.1 内存的不同用途 23
4.1.2 栈与系统栈 23
4.1.3 函数调用时发生了什么 23
4.1.4 寄存器与函数栈帧 23
4.1.5 函数调用约定与相关指令 23
4.2 修改邻接变量 23
4.2.1 修改邻接变量的原理 23
4.2.2 突破密码验证程序 23
4.3 修改函数返回地址 23
4.3.1 返回地址与程序流程 23
4.3.2 控制程序的执行流程 23
4.4 代码植入 23
4.4.1 代码植入的原理 23
4.4.2 向进程中植入代码 23
第五章 开发shellcode的艺术 24
5.1 shellcode概述 25
5.1.1 shellcode与exploit 25
5.1.2 shellcode需要解决的问题 25
5.2 定位shellcode 25
5.2.1 栈帧移位与jmp esp 25
5.2.2 获取“跳板”的地址 25
5.2.3 使用“跳板”定位的exploit 25
5.3 缓冲区的组织 25
5.3.1 缓冲区的组成 25
5.3.2 抬高栈顶保护shellcode 25
5.3.3 使用其他跳转指令 25
5.3.4 不使用跳转指令 25
5.3.5 函数返回地址移位 25
5.4 开发通用的shellcode 25
5.4.1 定位API的原理 25
5.4.2 shellcode的加载与调试 25
5.4.3 动态定位API地址的shellcode 26
5.5 shellcode编码技术 26
5.5.1 为什么要对shellcode编码 26
5.5.2 会“变形”的shellcode 26
5.6 为shellcode“减肥” 26
5.6.1 shellcode瘦身大法 26
5.6.2 选择恰当的hash算法 26
5.6.3 191个字节的bindshell 26
第6章 堆溢出利用 27
6.1 堆的工作原理 28
6.1.1 windows堆的历史 28
6.1.1 堆与栈的区别 28
6.1.2 堆的数据结构与管理策略 28
6.2 在堆中漫游 28
6.2.1 堆分配函数之间的调用关系 28
6.2.2 堆的调试方法 28
6.2.2 识别堆表 28
6.2.3 堆块的分配 28
6.2.4 堆块的释放 28
6.2.5 堆块的合并 28
6.3 堆溢出利用(上)——DWORD SHOOT 28
6.3.1 链表“拆卸”中的问题 28
6.3.2 在调试中体会“DWORD SHOOT” 28
6.4 堆溢出利用(下)——代码植入 28
6.4.1 DWORD SHOOT的利用方法 28
6.4.2 狙击P.E.B中RtlEnterCriticalSection()的函数指针 29
6.4.3 堆溢出利用的注意事项 29
第7章 windows异常处理机制深入浅出 30
7.1 S.E.H概述 31
7.2 在栈溢出中利用S.E.H 31
7.3 在堆溢出中利用S.E.H 31
7.4 挖掘windows异常处理 31
7.4.1 不同级别的S.E.H 31
7.4.2 线程的异常处理 31
7.4.3 进程的异常处理 31
7.4.4 系统默认的异常处理U.E.F 31
7.4.5 异常处理流程的总结 31
7.5 V.E.H简介 31
第8章 高级内存攻击技术 32
8.1 狙击异常处理机制 33
8.1.1 攻击V.E.H链表的头节点 33
8.1.2 攻击TEB中的S.E.H头结点 33
8.1.3 攻击U.E.F 33
8.1.4 攻击PEB中的函数指针 33
8.2 “off by one”的利用 33
8.3 攻击C++的虚函数 33
8.4 heap spray:堆与栈的协同攻击 33
第9章 揭秘windows安全机制 34
9.1 Service Pack 2简介 35
9.2 百密一疏的S.E.H验证 35
9.3 栈中的较量 35
9.3.1 .net中的GS安全编译选项 35
9.3.2 GS机制面临的挑战 35
9.4 重重保护下的堆 35
9.5 硬件方面的安全措施 35
第10章 用MetaSploit开发Exploit 36
10.1 漏洞测试平台MSF 简介 37
10.2 入侵windows系统 37
10.2.1 漏洞简介 37
10.2.2 图形界面的漏洞测试 37
10.2.3 console界面的漏洞测试 37
10.3 利用MSF制作shellcode 37
10.4 用MSF扫描“跳板” 37
10.5 Ruby语言简介 37
10.6 “傻瓜式”exploit开发 37
10.7 用MSF发布POC 37
第11章 其他漏洞利用技术 38
11.1 格式化串漏洞 39
11.1.1 printf中的缺陷 39
11.1.2 用printf读取内存数据 39
11.1.3 用printf向内存写数据 39
11.1.4 格式化串漏洞的检测与防范 39
11.2 SQL注入攻击 39
11.2.1 SQL注入原理 39
11.2.2 攻击PHP+MySQL网站 39
11.2.3 攻击ASP+SQL server网站 39
11.2.4 注入攻击的检测与防范 39
11.3 XSS攻击 39
11.3.1 脚本能够“跨站”的原因 39
11.3.2 XSS Reflection攻击场景 39
11.3.3 Stored XSS攻击场景 39
11.3.4 攻击案例回顾:XSS蠕虫 39
11.3.5 XSS的检测与防范 39
第三篇 漏洞分析 40
第12章 漏洞分析技术概述 41
12.1 漏洞分析的方法 41
12.2 用“白眉”在PE中漫步 41
12.2.1 指令追踪技术与Paimei 41
12.2.2 Paimei的安装 41
12.2.3 使用PE Stalker 41
12.2.4 迅速定位特定功能对应的代码 41
12.3 补丁比较 41
第13章 MS06-040分析:系统入侵与蠕虫 42
13.1 MS06-040简介 42
13.2 漏洞分析 42
13.2.1 动态调试 42
13.2.2 静态分析 42
13.3 远程Exploit 42
13.3.1 RPC编程简介 42
13.3.2 实现远程exploit 42
13.3.3 改进exploit 42
13.3.4 MS06-040与蠕虫 42
第14章 MS06-055分析:揭秘“网马” 43
14.1 MS06-055简介 43
14.1.1 矢量标记语言(VML)简介 43
14.1.2 0day安全响应纪实 43
14.2 漏洞分析 43
14.3 漏洞利用 43
14.3.1 实践Heap Spray技术 43
14.3.2 网页木马攻击 43
第15章MS07-060分析:Word文档中的阴谋 44
15.1 MS07-060简介 45
15.2 POC分析 45
第四篇 漏洞挖掘与软件安全性测试 46
第16章 漏洞挖掘技术浅谈 47
16.1 漏洞挖掘概述 47
16.2 Fuzz文件格式 47
16.2.1 File Fuzz简介 47
16.2.2 用Paimei实践File Fuzz 47
16.3 Fuzz网络协议 47
16.3.1 协议测试简介 47
16.3.2 SPIKE的Fuzz原理 47
16.3.4 SPIKE的Hello world 47
16.3.3 定义Block 47
16.3.5 生成Fuzz用例 47
16.4 Fuzz ActiveX 47
16.5 静态代码审计 47
第17章 安全的软件生命周期 48
17.1 Threat Modeling 49
17.2 编写安全的代码 49
17.3 产品安全性测试 49
17.4 漏洞管理与应急响应 49
参考文献 49
看到有些朋友从贴图上的title上已经发现,我正在编纂一本漏洞分析方面的技术书籍。
目前这本书正处于最后的排版,校对阶段,估计春节期间能够上架,有兴趣的朋友不妨到时候捧个场。另外觉得合胃口了记得向朋友推荐啊~~~~~(有点广告的嫌疑,呵呵)
由于这两周项目很紧张,书也处于最后阶段,因此本系列讲座可能会调整到2~3天一帖。
今天晚上的讲座我偷个懒,把我的书的目录公布一下,这个目录在一定程度上也是漏洞学习的一个大纲。通过这个知识框架,我们能够比较系统的对这门技术有一个整体的了解。
其实这个系列的讲座也基本上是从书中的相关章节中摘取出来,稍加修改后贴出来的。
后面我们的讲座中还会涉及shellcode技术,metasploit编程,以及部分实际案例调试章节中的一些内容。
在本讲座结束的时候,我会把讲座涉及的内容和书中的相关样章做成PDF在论坛上发布。希望大家多提意见,多给反馈。
自序
不请长缨,系取天骄种,剑吼西风
——《六州歌头》北宋,贺铸
虽然事隔多年,我仍然清晰记得自己被“冲击波”愚弄的场景——2003年夏的那个晚上,自己像往常一样打开实验室的计算机,一边嘲笑着旁边同学因为不装防火墙而被提示系统将在一分钟内关机,一边非常讽刺地在自己的计算机上发现了同样的提示对话框。正是这个闻名世界的“框框”,坚定了我投身网络安全研究的信念,而漏洞分析与利用正是这个领域的灵魂所在。
漏洞分析与利用的过程是充满艺术感的。想象一下,剥掉windows中那些经过层层封装的神秘的对话框“外衣”,面对着浩如烟海的二进制机器码,跋涉于内存中不知所云的海量数据,在没有任何技术文档可以参考的情况下,进行反汇编并调试,把握函数调用和参数传递的细节,猜测程序的设计思路,设置巧妙的断点并精确定位到几行有逻辑缺陷的代码,分析研究怎么去触发这个逻辑漏洞,最后编写出天才的渗透代码从而得到系统的控制权……这些分析过程的每一个环节无不散发着充满智慧的艺术美感!这种技术不同于其他计算机技术,它的进入门槛很高,需要拥有丰富的计算机底层知识、精湛的软件调试技术、非凡的逻辑分析能力,还要加上一点点创造性的思维以及可遇而不可求的运气。
在无数个钻研这些技术的夜里,我深深地感觉到国内漏洞分析资料和文献是多么的匮乏。为了真正搞清楚蠕虫病毒是怎样利用windows漏洞精确淹没EIP寄存器并获得进程控制权,我仍然记得自己不得不游走于各种论坛收集高手们零散手稿时的情形。那时的我多么希望能有一本教材式的书籍,让我读了之后比较全面、系统地了解这个领域。
我想,在同样漆黑的夜里,肯定还有无数朋友和我从前一样,满腔热情地想学习这门技术而又困惑于无从下手。正是这种“请缨无处,剑吼西风”的感觉,激励着我把自己钻研的心血凝结成一本教程,希望这样一本教程可以帮助喜欢网络安全的朋友们在学习时绕开我曾走过的弯路。
failwest
2007年11月1日
前言
关于安全技术人才
国内外对网络安全技术人才的需求量很大,精通缓冲区溢出攻击的安全专家可以在大型软件公司轻易的获得高薪的安全咨询职位。
信息安全技术是一个对技术性要求极高的领域,除了扎实的计算机理论基础外、更重要的是优秀的动手实践能力。在我看来,不懂二进制就无从谈起安全技术。
国内近年来对网络安全的重视程度正在逐渐增加,许多高校相继成立了“信息安全学院”或者设立“网络安全专业”。科班出身的学生往往具有扎实的理论基础,他们通晓密码学知识、知道PKI体系架构,但要谈到如何真刀实枪的分析病毒样本、如何拿掉PE上复杂的保护壳、如何在二进制文件中定位漏洞、如何对软件实施有效的攻击测试……能够做到的人并不多。
虽然每年有大量的网络安全技术人才从高校涌入人力市场,真正能够满足用人单位需求的却聊聊无几。捧着书本去做应急响应和风险评估是滥竽充数的作法,社会需要的是能够为客户切实解决安全风险的技术精英,而不是满腹教条的阔论者。
我所认识的很多资深安全专家都并非科班出身,他们有的学医、有的学文、有的根本没有学历和文凭,但他们却技术精湛,充满自信。
这个行业属于有兴趣、够执着的人,属于为了梦想能够不懈努力的意志坚定者。
关于“Impossible” 与“I’m possible”
从拼写上看,“Impossible”与“I’m possible”仅仅相差一个用于缩写的撇号(apostrophe)。学完本书之后,您会发现将“不可能(Impossible)”变为“可能(I’m possible)”的“关键(key point)”往往就是那么简单的几个字节,本书将要讨论的就是在什么位置画上这一撇!
从语法上看,“Impossible”是一个单词,属于数据的范畴;“I’m possible”是一个句子,含有动词(算符),可以看成是代码的范畴。学完本书之后,您会明白现代攻击技术的精髓就是混淆数据和代码的界限,让系统错误的把数据当作代码去执行。
从意义上看,To be the apostrophe which changed “Impossible” into “I’m possible” 代表着人类挑战自我的精神,代表着对理想执着的追求,代表着对事业全情的投入,代表着敢于直面惨淡人生的豪情……而这一切正好是黑客精神的完美诠释——还记得在电影“Sword Fish(剑鱼行动)”中,Stan在那台酷毙的计算机前坚定的说:“Nothing is impossible”,然后开始在使用Vernam加密算法和512位密钥加密的网络上,挑战蠕虫的经典镜头么?
于是我在以前所发表过的所有文章,代码中都加入了这个句子,甚至用它作为自己的签名档。
尽管我的英语老师和不少外国朋友提醒我,说这个句子带有强烈的“Chinglish”味道,甚至会引起Native Speaker的误解,然而我最终还是决定把它写进书里。
虽然我不是莎士比亚那样的文豪,可以创造语言,发明修辞,用文字撞击人们的心灵,但这句“Chinglish”的确能把我所要表达的含义精确的传递给中国人,这已足够。
关于本书
通常情况下,利用缓冲区溢出漏洞需要深入了解计算机系统,精通汇编语言乃至二进制的机器代码,这足以使大多数技术爱好者望而却步。
随着时间的推移,缓冲区溢出攻击在漏洞的挖掘、分析、调试、利用等环节上已经形成了一套完整的体系。伴随着调试技术和逆向工程的发展,Windows平台下涌现出的众多功能强大的debug工具和反汇编分析软件逐渐让二进制世界和操作系统变得不再神秘,这有力的推动了windows平台下缓冲区溢出的研究。 除此以外,近年来甚至出现了基于架构(Frame Work)的漏洞利用程序开发平台,让这项技术的进入门槛大大降低,使得原本高不可攀的黑客技术变得不再遥不可及。
遗憾的是,与国外飞速发展的高级黑客技术相比,目前国内还没有系统介绍windows平台下缓冲区溢出漏洞利用技术的专业书籍,而且相关的中文文献资料也非常匮乏。
本书将系统全面的介绍windows平台软件缓冲区溢出漏洞的发现,检测,分析,以及利用等方面的知识。
为了保证这些技术能够被读者轻松理解并掌握,本书在叙述中尽量避免枯燥乏味的大段理论阐述和代码粘贴。概念只有在实践中运用后才能真正被掌握,这是我多年来求学生涯的深刻体会。书中所有概念和方法都会在紧随其后的调试实验中被再次解释,实验和案例是本书的精髓所在。从为了阐述概念而精心自制的漏洞程序调试实验到现实中已经造成很大影响的著名漏洞分析,每一个调试实验都有着不同的技术侧重点,每一个漏洞利用都有自己的独到之处。
我将带领您一步一步地完成调试的每一步,并在这个过程中逐步解释漏洞分析思路。不管您是网络安全从业人员、黑客技术发烧友、网络安全专业的研究生或本科生,如果您能够完成这些分析实验,相信您的软件调试技术、对操作系统底层的理解等计算机能力一定会得到一次质的飞跃,并能够对安全技术有一个比较深入的认识。
内容导读
本书分为4篇,共17章。
第一篇 基础知识
第1章 漏洞概述
简介漏洞研究中的一些基础概念和原理
第2章 二进制文件概述
不管是漏洞挖掘,漏洞分析还是漏洞利用,我们所面对的都是二进制、机器码、内存地址。第2章将简单介绍windows平台下可执行文件的结构和内存方面的一些基础知识。PE文件和虚拟内存的细节枯燥乏味,长篇累牍的介绍很容易让人失去学习的兴趣和激情。但在进行静态反汇编和动态调试的过程中,如果没有PE和虚拟内存方面的基础知识,您甚至无法把反汇编的内容和正在执行的指令对应起来。根据漏洞分析利用的特点,这章给出了调试漏洞所必须的二进制基础知识。
第3章 必备工具
第3章介绍了一批漏洞分析与利用中经常使用的软件工具。包括调试工具、反汇编工具、二进制编辑工具等。您会在后面的调试实验中反复见到这些工具的身影。在这章的最后一节,我设计了一个非常简单的破解小实验,用于实践工具的应用,消除您对二进制的恐惧感,希望能够给您带来一些乐趣。
第二篇 漏洞利用
第4章 栈溢出利用
基于栈的溢出是最基础的漏洞利用方法。第4章首先用大量的示意图,深入浅出地讲述了操作系统中函数调用、系统栈操作等概念和原理;随后通过三个调试实验逐步讲解如何通过栈溢出,一步一步的劫持进程并植入可执行的机器代码。即使您没有任何汇编语言基础,从未进行过二进制级别的调试,在本章详细的实验指导下也能轻松完成实验,体会到exploit的乐趣。
第5章 开发shellcode的艺术
第5章紧接第4章的讨论,比较系统的介绍了溢出发生后,如何布置缓冲区、如何定位shellcode、如何编写和调试shellcode等实际的问题。掌握这章的内容意味着您已经具备初步开发栈溢出利用程序的能力。第5章的最后两小节还给出了一些编写shellcode的高级技术,供有一定汇编基础的朋友参考。
第6章 堆溢出利用
在很长一段时间内,windows下的堆溢出被认为是不可利用的,然而事实并非如此。第6章将用精辟的论述点破堆溢出利用的原理,让您轻松领会堆溢出的精髓。此外,这章的一系列调试实验将加深您对概念和原理的理解。用通俗易懂的方式论述复杂的技术是本书始终坚持的原则。
第7章 windows异常处理机制深入浅出
对异常处理的利用是windows平台下缓冲区溢出漏洞利用的一大特点。第7章除了介绍如何在溢出发生时利用S.E.H外,还对windows异常处理机制做了较深入地剖析,供有一定基础的读者参考。
第8章 高级内存攻击技术
第8章集中介绍了一些曾发表于Black Hat上的著名论文中所提出的高级利用技术,这些思路往往能在高难度漏洞利用中给您以一定的启发。
第9章 揭秘windows安全机制
微软在Windows XP SP2和windows 2003之后,向操作系统中加入了许多安全机制。本章将集中讨论这些安全机制对漏洞利用的影响。
第10章 用metasploit开发exploit
MetaSploit是软件工程中的Frame Work(架构)在安全技术中的完美实现,它把模块化、继承性、封装等面向对象的特点在漏洞利用程序的开发中发挥的淋漓尽致。使用这个架构开发exploit要比直接使用C语言写出的exploit简单的多。第10章将集中介绍如何使用这个架构进行exploit开发,这也将是第一次在中文书籍中集中介绍MetaSploit通用漏洞测试平台。
第11章 其它漏洞利用技术
格式化串漏洞在windows平台上非常罕见,所以我把这种漏洞利用单独放在本章介绍。除此以外,由于脚本注入漏洞与缓冲区溢出漏洞的利用在技术上差异较大,故也被安排在这章。鉴于基于WEB的漏洞利用种目繁杂,且自成体系,本书目前只做了简单的介绍。如有机会,我将单独著书述之。
第三篇 漏洞分析
第12章 漏洞分析技术概述
第12章纵览了漏洞分析与调试的思路,并介绍了一些辅助漏洞调试分析的高级逆向工具。
第13章 MS06-040分析:系统入侵与蠕虫
通过对真实案例的分析,彻底揭秘攻击者入侵操作系统的全过程。在您获得操作系统控制权限的那一刻,相信伴随着强烈的成就感,之前所有付出的努力和艰辛都将涌上心头。
第14章 MS06-055分析:揭秘“网马”内幕
通过网页“挂马”是近年来攻击者惯用的手法。本章通过分析微软IE浏览器中真实的缓冲区溢出漏洞,告诉您为什么不能随便点击来历不明的RUL链接
第15章 MS07-060分析:Word文档中的阴谋
稍懂计算机知识的人都不会随便点击可执行文件,但是谁会想到打开Word文档也会导致shellcode的执行呢?如果office中存在漏洞,那么打开word文档就也有可能导致shellcode被执行。
第四篇 漏洞挖掘与产品安全
第16章 漏洞挖掘技术浅谈
不论从工程上讲还是从学术上讲,漏洞挖掘都是一个相当前沿的领域。本章将介绍一些目前比较流行的漏洞挖掘方法,并着重介绍Fuzz测试的方法。相信本章的内容对于QA工程师和软件测试人员也会有用。
第17章 安全的软件生命周期
要做到尽可能的避免软件中的安全漏洞,仅仅靠安全测试和漏洞挖掘是远远不够的,那需要在软件生命周期的各个环节中加入安全因素。
本书源代码及相关文档
本书中调试实验所涉及的所有源代码和PE文件都被收录在附带光盘中。
这些代码都经过了仔细调试,如在使用中发现问题,请查看实验指导中对实验环境的要求。个别攻击实验的代码可能会被部分杀毒软件鉴定为存在风险的文件,请您调试前详细阅读实验说明。
此外,“看雪论坛”相关版面可以找到更多本书中所涉及的资源。
对读者的要求
虽然溢出技术经常涉及汇编语言,但本书并不要求读者一定具备汇编语言的开发能力。所用到的指令和寄存器在相关的章节都有额外介绍,只要您有C语言基础就能消化本书的绝大部分内容。
我并不推荐在阅读本书之前先去系统的学习汇编知识和逆向知识,枯燥的寻址方式和指令介绍很容易让人失去学习的兴趣。本书将带您迅速跨过漏洞分析与利用技术的进入门槛。即使您并不懂汇编与二进制也能完成书中的调试实验,并获得一定的乐趣。当然,在您达到一定水平想进一步提高时,补习逆向知识和汇编语言将是绝对必要的。
本书适合的读者群体包括:
安全技术工作者 本书比较全面、系统地收录了windows平台下缓冲区溢出攻击所涉及的各种方法,将会是一本不错的技术字典。
信息安全理论研究者 本书中纰漏的许多漏洞利用、检测方法在学术上具有一定的前沿性,在一定程度上反映了目前国内外安全技术所关注的焦点问题。
QA工程师,软件测试人员 本书第四篇中集中介绍了产品安全性测试方面的知识,这些方法可以指导QA人员审计软件中的安全漏洞,增强软件的安全性,提高软件质量。
软件开发人员 知道漏洞利用原理将有利于编写出安全的代码。
高校信息安全专业的学生 本书将在一定程度上弥补高校教育与信息安全公司人才需求脱节的现象。用一套过硬的调试技术和逆向技术来武装自己可以让您在未来的求职道路上利于不败之地。精通exploit的人才可以轻松征服任何一家杀毒软件公司或安全资讯公司的求职门槛,获得高薪工作。
本科二年级以上计算机系学生 通过调试实验,你们将更加深入的了解计算机体系架构和操作系统。这些知识一样将成为您未来求职时过硬的敲门砖
所有黑客技术爱好者 如果您厌倦了网络嗅探、端口扫描之类的扫盲读物,您将在本书中学到实施有效攻击所必备的知识和技巧
反馈与提问
读者在阅读本书时如遇到任何问题,可以到看雪论坛相关版面提出或发送E-mail给我
目录
目录 12
第一篇 基础知识 18
第1章 漏洞概述 19
1.1 bug与漏洞 19
1.2 几个令人困惑的安全问题 19
1.3 漏洞挖掘、漏洞分析、漏洞利用 19
1.4 漏洞的公布与0day响应 19
第2章 二进制文件概述 19
2.1 PE文件格式 19
2.2 虚拟内存 19
2.3 PE文件与虚拟内存之间的映射 19
第3章 必备工具 20
3.1 OllyDbg简介 20
3.2 SoftICE简介 20
3.3 WinDbg 简介 20
3.4 IDA PRO简介 20
3.5 二进制编辑器 20
3.6 虚拟机简介 20
3.7 CRACK二进制文件 20
第二篇 漏洞利用 21
第4章 栈溢出利用 22
4.1 系统栈的工作原理 23
4.1.1 内存的不同用途 23
4.1.2 栈与系统栈 23
4.1.3 函数调用时发生了什么 23
4.1.4 寄存器与函数栈帧 23
4.1.5 函数调用约定与相关指令 23
4.2 修改邻接变量 23
4.2.1 修改邻接变量的原理 23
4.2.2 突破密码验证程序 23
4.3 修改函数返回地址 23
4.3.1 返回地址与程序流程 23
4.3.2 控制程序的执行流程 23
4.4 代码植入 23
4.4.1 代码植入的原理 23
4.4.2 向进程中植入代码 23
第五章 开发shellcode的艺术 24
5.1 shellcode概述 25
5.1.1 shellcode与exploit 25
5.1.2 shellcode需要解决的问题 25
5.2 定位shellcode 25
5.2.1 栈帧移位与jmp esp 25
5.2.2 获取“跳板”的地址 25
5.2.3 使用“跳板”定位的exploit 25
5.3 缓冲区的组织 25
5.3.1 缓冲区的组成 25
5.3.2 抬高栈顶保护shellcode 25
5.3.3 使用其他跳转指令 25
5.3.4 不使用跳转指令 25
5.3.5 函数返回地址移位 25
5.4 开发通用的shellcode 25
5.4.1 定位API的原理 25
5.4.2 shellcode的加载与调试 25
5.4.3 动态定位API地址的shellcode 26
5.5 shellcode编码技术 26
5.5.1 为什么要对shellcode编码 26
5.5.2 会“变形”的shellcode 26
5.6 为shellcode“减肥” 26
5.6.1 shellcode瘦身大法 26
5.6.2 选择恰当的hash算法 26
5.6.3 191个字节的bindshell 26
第6章 堆溢出利用 27
6.1 堆的工作原理 28
6.1.1 windows堆的历史 28
6.1.1 堆与栈的区别 28
6.1.2 堆的数据结构与管理策略 28
6.2 在堆中漫游 28
6.2.1 堆分配函数之间的调用关系 28
6.2.2 堆的调试方法 28
6.2.2 识别堆表 28
6.2.3 堆块的分配 28
6.2.4 堆块的释放 28
6.2.5 堆块的合并 28
6.3 堆溢出利用(上)——DWORD SHOOT 28
6.3.1 链表“拆卸”中的问题 28
6.3.2 在调试中体会“DWORD SHOOT” 28
6.4 堆溢出利用(下)——代码植入 28
6.4.1 DWORD SHOOT的利用方法 28
6.4.2 狙击P.E.B中RtlEnterCriticalSection()的函数指针 29
6.4.3 堆溢出利用的注意事项 29
第7章 windows异常处理机制深入浅出 30
7.1 S.E.H概述 31
7.2 在栈溢出中利用S.E.H 31
7.3 在堆溢出中利用S.E.H 31
7.4 挖掘windows异常处理 31
7.4.1 不同级别的S.E.H 31
7.4.2 线程的异常处理 31
7.4.3 进程的异常处理 31
7.4.4 系统默认的异常处理U.E.F 31
7.4.5 异常处理流程的总结 31
7.5 V.E.H简介 31
第8章 高级内存攻击技术 32
8.1 狙击异常处理机制 33
8.1.1 攻击V.E.H链表的头节点 33
8.1.2 攻击TEB中的S.E.H头结点 33
8.1.3 攻击U.E.F 33
8.1.4 攻击PEB中的函数指针 33
8.2 “off by one”的利用 33
8.3 攻击C++的虚函数 33
8.4 heap spray:堆与栈的协同攻击 33
第9章 揭秘windows安全机制 34
9.1 Service Pack 2简介 35
9.2 百密一疏的S.E.H验证 35
9.3 栈中的较量 35
9.3.1 .net中的GS安全编译选项 35
9.3.2 GS机制面临的挑战 35
9.4 重重保护下的堆 35
9.5 硬件方面的安全措施 35
第10章 用MetaSploit开发Exploit 36
10.1 漏洞测试平台MSF 简介 37
10.2 入侵windows系统 37
10.2.1 漏洞简介 37
10.2.2 图形界面的漏洞测试 37
10.2.3 console界面的漏洞测试 37
10.3 利用MSF制作shellcode 37
10.4 用MSF扫描“跳板” 37
10.5 Ruby语言简介 37
10.6 “傻瓜式”exploit开发 37
10.7 用MSF发布POC 37
第11章 其他漏洞利用技术 38
11.1 格式化串漏洞 39
11.1.1 printf中的缺陷 39
11.1.2 用printf读取内存数据 39
11.1.3 用printf向内存写数据 39
11.1.4 格式化串漏洞的检测与防范 39
11.2 SQL注入攻击 39
11.2.1 SQL注入原理 39
11.2.2 攻击PHP+MySQL网站 39
11.2.3 攻击ASP+SQL server网站 39
11.2.4 注入攻击的检测与防范 39
11.3 XSS攻击 39
11.3.1 脚本能够“跨站”的原因 39
11.3.2 XSS Reflection攻击场景 39
11.3.3 Stored XSS攻击场景 39
11.3.4 攻击案例回顾:XSS蠕虫 39
11.3.5 XSS的检测与防范 39
第三篇 漏洞分析 40
第12章 漏洞分析技术概述 41
12.1 漏洞分析的方法 41
12.2 用“白眉”在PE中漫步 41
12.2.1 指令追踪技术与Paimei 41
12.2.2 Paimei的安装 41
12.2.3 使用PE Stalker 41
12.2.4 迅速定位特定功能对应的代码 41
12.3 补丁比较 41
第13章 MS06-040分析:系统入侵与蠕虫 42
13.1 MS06-040简介 42
13.2 漏洞分析 42
13.2.1 动态调试 42
13.2.2 静态分析 42
13.3 远程Exploit 42
13.3.1 RPC编程简介 42
13.3.2 实现远程exploit 42
13.3.3 改进exploit 42
13.3.4 MS06-040与蠕虫 42
第14章 MS06-055分析:揭秘“网马” 43
14.1 MS06-055简介 43
14.1.1 矢量标记语言(VML)简介 43
14.1.2 0day安全响应纪实 43
14.2 漏洞分析 43
14.3 漏洞利用 43
14.3.1 实践Heap Spray技术 43
14.3.2 网页木马攻击 43
第15章MS07-060分析:Word文档中的阴谋 44
15.1 MS07-060简介 45
15.2 POC分析 45
第四篇 漏洞挖掘与软件安全性测试 46
第16章 漏洞挖掘技术浅谈 47
16.1 漏洞挖掘概述 47
16.2 Fuzz文件格式 47
16.2.1 File Fuzz简介 47
16.2.2 用Paimei实践File Fuzz 47
16.3 Fuzz网络协议 47
16.3.1 协议测试简介 47
16.3.2 SPIKE的Fuzz原理 47
16.3.4 SPIKE的Hello world 47
16.3.3 定义Block 47
16.3.5 生成Fuzz用例 47
16.4 Fuzz ActiveX 47
16.5 静态代码审计 47
第17章 安全的软件生命周期 48
17.1 Threat Modeling 49
17.2 编写安全的代码 49
17.3 产品安全性测试 49
17.4 漏洞管理与应急响应 49
参考文献 49