标题：漏洞分析
图书信息
安全技术大系  0day安全：软件漏洞分析技术（第2版） 
王清主编
ISBN 978-7-121-13396-1  
2011年6月出版
定价：85.00元
16开
780页
内 容 简 介
本书分为5篇33章，系统、全面地介绍了Windows平台缓冲区溢出漏洞的分析、检测与防护。第一篇为漏洞exploit的基础理论和初级技术，可以引领读者迅速入门；第二篇在第一篇的基础上，结合国内外相关研究者的前沿成果，对漏洞技术从攻、防两个方面进行总结；第三篇站在安全测试者的角度，讨论了几类常用软件的漏洞挖掘方法与思路；第四篇则填补了本类书籍在Windows内核安全及相关攻防知识这个神秘领域的技术空白；第五篇以大量的0 day案例分析，来帮助读者理解前四篇的各类思想方法。
本书可作为网络安全从业人员、黑客技术发烧友的参考指南，也可作为网络安全专业的研究生或本科生的指导用书。
自 序
虽然事隔多年，我仍然清晰记得自己被“冲击波”愚弄的场景——2003年夏的那个晚上，自己像往常一样打开实验室的计算机，一边嘲笑着旁边同学因为不装防火墙而被提示系统将在一分钟内关机，一边非常讽刺地在自己的计算机上发现了同样的提示对话框。正是这个闻名世界的“框框”坚定了我投身网络安全研究的信念，而漏洞分析与利用正是这个领域的灵魂所在。
漏洞分析与利用的过程是充满艺术感的。想象一下，剥掉Windows中那些经过层层封装的神秘的对话框“外衣”，面对着浩如烟海的二进制机器码，跋涉于内存中不知所云的海量数据，在没有任何技术文档可以参考的情况下，进行反汇编并调试，把握函数调用和参数传递的细节，猜测程序的设计思路，设置巧妙的断点并精确定位到几行有逻辑缺陷的代码，分析研究怎么去触发这个逻辑漏洞，最后编写出天才的渗透代码，从而得到系统的控制权……这些分析过程的每一个环节无不散发着充满智慧的艺术美感！这种技术不同于其他计算机技术，它的进入门槛很高，需要拥有丰富的计算机底层知识、精湛的软件调试技术、非凡的逻辑分析能力，还要加上一点点创造性的思维和可遇而不可求的运气。
在无数个钻研这些技术的夜里，我深深地感觉到国内的漏洞分析资料和文献是多么匮乏。为了真正搞清楚蠕虫病毒是怎样利用Windows漏洞精确淹没EIP寄存器并获得进程控制权，我仍然记得自己不得不游走于各种论坛收集高手们零散手稿时的情形。那时的我多么希望能有一本教材式的书籍，让我读了之后比较全面、系统地了解这个领域。
我想，在同样漆黑的夜里，肯定还有无数朋友和我从前一样，满腔热情地想学习这门技术而又困惑于无从下手。正是这种“请缨无处，剑吼西风”的感觉，激励着我把自己钻研的心血凝结成一本教程，希望这样一本教程可以帮助喜欢网络安全的朋友们在学习时绕开我曾走过的弯路。
再版序
距离《0day安全：软件漏洞分析技术》的出版已有3年，接到再版约稿的时候我着实有一番感慨，也有着太多的内容想与大家分享。在这3年里，我经历了从一个初出象牙塔的少年到安全分析员的演变。期间我参加了若干次安全事件的应急响应、在若干个安全峰会上做过漏洞技术的演讲、完成了无数次的渗透测试、也有幸见证了先行者们在Windows平台上进行的最为精彩的几场较量……
为了在再版中更加完美地总结这精彩的几年，我特意邀请了几位和我意气相投的兄弟加入编写团队，他们是：
熟悉Windows内核机制的张东辉（Shineast，负责编写内核安全部分）；
精通Windows各类保护机制的周浩（Zihan，负责编写高级溢出部分）；
黑客防线的知名撰稿人、漏洞挖掘专家王继刚（爱无言，负责编写漏洞挖掘部分）；
文件格式解析专家赵双（Dflower，负责编写文件型漏洞测试部分）；
资深病毒分析员蔡山枫（Beanniecai，编写样本分析和案例分析的部分章节）。
团队的力量大大增强了再版内容的广度和深度。再版中新增了大量前沿知识和案例分析，囊括了Windows平台高级溢出技巧、手机平台的溢出基础、内核攻防、漏洞挖掘与安全测试、大量的0day分析案例等。此外我们还对Windows平台中高级防护技巧和部分经典案例的分析等内容进行了修订和勘误。第一版中关于基础溢出的知识也得以保留，在经过重新编排和浓缩后，放置在再版的第一篇供入门者学习。
在计算机工业向模块化、封装化、架构化发展的过程中，人们更加倾向于把时间和精力用于那些敏捷开发的高级工具上。走进大学的计算机系你可以发现J2EE与.NET的书籍随处可见，但是却没有几个学生能在二进制级别把计算机体系结构讲清。甚至在某些网络安全学院里，能把蠕虫入侵的原理刨根问底彻底、弄清的也是凤毛麟角，非好奇心不盛也，乃道之不传也久矣。在信息安全这条道路上行走，需要“男儿何不带吴钩，收取关山五十州”的豪情，需要“臣心一片磁针石，不指南方不肯休”的毅力，需要“壁立千仞，无欲则刚”的情怀……我等立书只为布道交友，最大的收益莫过于帮助还在彷徨如何入门的朋友迈过那条门槛，通过此书结交更多的同道中人。
前 言
关于安全技术人才
国内外对网络安全技术人才的需求量很大，精通缓冲区溢出攻击的安全专家可以在大型软件公司轻易地获得高薪的安全咨询职位。
信息安全技术是一个对技术性要求极高的领域，除了扎实的计算机理论基础外，更重要的是优秀的动手实践能力。在我看来，不懂二进制数据就无从谈起安全技术。
国内近年来对网络安全的重视程度正在逐渐增加，许多高校相继成立了“信息安全学院”或者设立“网络安全专业”。科班出身的学生往往具有扎实的理论基础，他们通晓密码学知识、知道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平台软件缓冲区溢出漏洞的发现、检测、分析和利用等方面的知识。
为了保证这些技术能够被读者轻松理解并掌握，本书在叙述中尽量避免枯燥乏味的大段理论阐述和代码粘贴。概念只有在实践中运用后才能真正被掌握，这是我多年来求学生涯的深刻体会。书中所有概念和方法都会在紧随其后的调试实验中被再次解释，实验和案例是本书的精髓所在。从为了阐述概念而精心自制的漏洞程序调试实验到现实中已经造成很大影响的著名漏洞分析，每一个调试实验都有着不同的技术侧重点，每一个漏洞利用都有自己的独到之处。
我将带领您一步一步地完成调试的每一步，并在这个过程中逐步解释漏洞分析思路。不管您是网络安全从业人员、黑客技术发烧友、网络安全专业的研究生或本科生，如果您能够完成这些分析实验，相信您的软件调试技术、对操作系统底层的理解等计算机能力一定会得到一次质的飞跃，并能够对安全技术有一个比较深入的认识。
关于本书源代码及相关文档
本书中调试实验所涉及的所有源代码和PE文件都可从看雪论坛相关版面下载
这些代码都经过了仔细调试，如在使用中发现问题，请查看实验指导中对实验环境的要求。个别攻击实验的代码可能会被部分杀毒软件鉴定为存在风险的文件，请您调试前详细阅读实验说明。
关于对读者的要求
虽然溢出技术经常涉及汇编语言，但本书并不要求读者一定具备汇编语言的开发能力。所用到的指令和寄存器在相关的章节都有额外介绍，只要您有C语言基础就能消化本书的绝大部分内容。
我并不推荐在阅读本书之前先去系统的学习汇编知识和逆向知识，枯燥的寻址方式和指令介绍很容易让人失去学习的兴趣。本书将带您迅速跨过漏洞分析与利用技术的进入门槛。即使您并不懂汇编与二进制也能完成书中的调试实验，并获得一定的乐趣。当然，在您达到一定水平想进一步提高时，补习逆向知识和汇编语言将是绝对必要的。
本书适合的读者群体包括：
 安全技术工作者　本书比较全面、系统地收录了Windows平台下缓冲区溢出攻击所涉及的各种方法，将会是一本不错的技术字典。
 信息安全理论研究者　本书中纰漏的许多漏洞利用、检测方法在学术上具有一定的前沿性，在一定程度上反映了目前国内外安全技术所关注的焦点问题。
 QA工程师、软件测试人员　本书第4篇中集中介绍了产品安全性测试方面的知识，这些方法可以指导QA人员审计软件中的安全漏洞，增强软件的安全性，提高软件质量。
 软件开发人员　知道漏洞利用原理将有利于编写出安全的代码。
 高校信息安全专业的学生　本书将在一定程度上弥补高校教育与信息安全公司人才需求脱节的现象。用一套过硬的调试技术和逆向技术来武装自己可以让您在未来的求职道路上利于不败之地。精通exploit的人才可以轻松征服任何一家杀毒软件公司或安全资讯公司的求职门槛，获得高薪工作。
 本科二年级以上计算机系学生　通过调试实验，你们将更加深入地了解计算机体系架构和操作系统。这些知识一样将成为您未来求职时过硬的敲门砖。
 所有黑客技术爱好者　如果您厌倦了网络嗅探、端口扫描之类的扫盲读物，您将在本书中学到实施有效攻击所必备的知识和技巧。
致谢
感谢电子工业出版社对本书的大力支持，尤其是毕宁编辑为本书出版所做的大量工作。
感谢看雪对本书的大力推荐和支持以及看雪论坛为本书提供的交流平台。
非常感谢在本书第一版问世后，向我提供勘误信息的众多热心读者，本书质量的提高离不开你们热心的帮助。
感谢赛门铁克中国响应中心的病毒分析员Beannie Cai为本书第26章友情撰稿。
最后感谢我的母校西安交通大学，是那里踏实求是的校风与校训激励着我不断进步。
Failwest
2011年5月4日
内容导读
本书分为5篇，共33章。
第1篇  漏洞利用原理（初级）
第1章  基础知识
本章着重对漏洞挖掘中的一些基础知识进行介绍。首先是漏洞研究中的一些基本概念和原理；然后是对Windows平台下可执行文件的结构和内存方面的一些基础知识的介绍；最后介绍了一些漏洞分析中经常使用的软件工具。包括调试工具、反汇编工具、二进制编辑工具等。您会在后面的调试实验中反复见到这些工具的身影。在这章的最后一节，我们设计了一个非常简单的破解小实验，用于实践工具的应用，消除您对二进制的恐惧感，希望能够给您带来一些乐趣。
第2章  栈溢出原理与实践
基于栈的溢出是最基础的漏洞利用方法。本章首先用大量的示意图，深入浅出地讲述了操作系统中函数调用、系统栈操作等概念和原理；随后通过三个调试实验逐步讲解如何通过栈溢出，一步一步地劫持进程并植入可执行的机器代码。即使您没有任何汇编语言基础，从未进行过二进制级别的调试，在本章详细的实验指导下也能轻松完成实验，体会到exploit的乐趣。
第3章  开发shellcode的艺术
本章紧接第2章的讨论，比较系统地介绍了溢出发生后，如何布置缓冲区、如何定位shellcode、如何编写和调试shellcode等实际的问题。最后两小节还给出了一些编写shellcode的高级技术，供有一定汇编基础的朋友做参考。
第4章  用MetaSploit开发Exploit
MetaSploit是软件工程中的Frame Work（架构）在安全技术中的完美实现，它把模块化、继承性、封装等面向对象的特点在漏洞利用程序的开发中发挥得淋漓尽致。使用这个架构开发Exploit要比直接使用C语言写出的Exploit简单得多。本章将集中介绍如何使用这个架构进行Exploit开发。
第5章  堆溢出利用
在很长一段时间内，Windows下的堆溢出被认为是不可利用的，然而事实并非如此。本章将用精辟的论述点破堆溢出利用的原理，让您轻松领会堆溢出的精髓。此外，这章的一系列调试实验将加深您对概念和原理的理解。用通俗易懂的方式论述复杂的技术是本书始终坚持的原则。
第6章  形形色色的内存攻击技术
在了解基本的堆栈溢出后，本章将为大家展示更为高级的内存攻击技术。本章集中介绍了一些曾发表于Black Hat上的著名论文中所提出的高级利用技术，如狙击Windows异常处理机制、攻击虚函数、off by one、 Heap Spray等利用技巧。对于安全专家，了解这些技巧和手法不至于在分析漏洞时错把可以利用的漏洞误判为低风险类型；对于黑客技术爱好者，这些知识很可能成为激发技术灵感的火花。
第7章  手机里的缓冲区溢出
在PC机上的溢出攻击进行的如火如荼的时候，您是否也想了解手机平台上的缓冲区溢出问题？那就不要错过本章！本章以ARM和Windows Mobile为例，介绍手机平台上编程和调试技巧。并在最后以一个手机上的exploit me为大家揭开手机里缓冲区溢出的神秘面纱。
第8章  其他类型的软件漏洞
缓冲区溢出漏洞只是软件漏洞的一个方面，我们来看看其他一些流行的安全漏洞。如格式化串漏洞、SQL注入、XPath注入、XSS等安全漏洞产生的原因、利用技巧及防范措施。
第2篇  漏洞利用原理（高级）
第9章  Windows安全机制概述
微软在Windows XP SP2和Windows 2003之后，向操作系统中加入了许多安全机制。本章将集中讨论这些安全机制对漏洞利用的影响。
第10章  栈中的守护天使：GS
针对缓冲区溢出时覆盖函数返回地址这一特征，微软在编译程序时使用了一个很酷的安全编译选项——GS。本章将对GS编译选项的原理进行详细介绍，并介绍几种绕过GS的溢出技巧。
第11章  亡羊补牢：SafeSEH
攻击S.E.H已经成为windows平台下漏洞利用的经典手法。为了遏制日益疯狂的攻击，微软在Windows XP SP2及后续版本的操作系统中引入了著名的S.E.H校验机制SafeSEH。本章将会对这一安全机制进行详细的分析，并介绍其中的不足和绕过方法。
第12章  数据与程序的分水岭：DEP
溢出攻击的根源在于现代计算机对数据和代码没有明确区分这一先天缺陷， 而DEP这种看似釜底抽薪式的防护措施是否真的可以杜绝溢出攻击呢？答案马上揭晓。
第13章  在内存中躲猫猫：ASLR
程序加载时不再使用固定的基址加载，ASLR技术将溢出时使用的跳板在内存中隐藏了起来，没有了跳板我们如何溢出呢？本章将带领您在黑暗中寻找溢出的出口。
第14章  S.E.H终极防护：SEHOP
SafeSEH的败北，让微软推出一种更为严厉的S.E.H保护机制SEHOP。这里将为您展示这种保护机制的犀利之处。
第15章  重重保护下的堆
当堆溢出变成可能后，微软不能再无视堆中的保护机制了，让我们一览堆中的保护机制，并分析其漏洞。
第3篇  漏洞挖掘技术
第16章  漏洞挖掘技术简介
不论从工程上讲还是从学术上讲，漏洞挖掘都是一个相当前沿的领域。本章将从动态测试和静态审计两方面对漏洞挖掘技术的基础知识进行简单的介绍。
第17章  文件类型漏洞挖掘与Smart Fuzz
文件类型的漏洞层出不穷，持续威胁着互联网的安全。如何系统的测试文件格式，产生精确有效的畸形测试用例用以发掘文件解析器的安全漏洞，并不是一件容易的事情。本章将从理论和实践两个方面向您讲述灰盒测试技术。
第18章  FTP的漏洞挖掘
本章将简述FTP协议，并手把手地带领您完成几个初级的漏洞测试案例，让您亲身体会下真实的漏洞长什么模样。
第19章  E-mail的漏洞挖掘
E-mail系统涉及的安全问题不光只有缓冲区溢出，在本章的挖掘案例中，您会发现除了工具和常用方法外，威力最为强大的武器还是您的大脑。Evil thinking是安全测试中最重要的思维方式之一。
第20章  ActiveX控件的漏洞挖掘
控件类漏洞曾经是大量网马的栖身之地。本章将结合若干个曾经的0 day向您比较系统的介绍这类漏洞的测试、调试的相关工具和方法。
第4篇  操作系统内核安全
第21章  探索ring0
研究内核漏洞，需要首先掌握一些内核基础知识，例如内核驱动程序的开发、编译、运行和调试，内核中重要的数据结构等，本章将为读者开启探索ring0之门，逐步掌握一些内核基础知识。
第22章  内核漏洞利用技术
本章将带领读者从一个简单的内核漏洞程序exploitme.sys的编写开始，展示内核漏洞利用的思路、方法，以及利用程序和Ring0 Shellcode的编写和设计。
第23章  FUZZ驱动程序
掌握了内核漏洞的原理和利用方法，本章将进入内核漏洞挖掘阶段，学习较为高级的内核漏洞挖掘技术，最后实践该漏洞挖掘技术，分析挖掘出内核漏洞。
第24章  内核漏洞案例分析
本章对几种典型的内核漏洞，用几个真实的内核漏洞案例来详细分析，分析漏洞造成的具体原因和细节，并构造漏洞成功利用的方法。
第5篇  漏洞分析案例
第25章  漏洞分析技术概述
本章纵览了漏洞分析与调试的思路，并介绍了一些辅助漏洞调试分析的高级逆向工具。
第26章  RPC入侵：MS06-040 与MS08-067
由于可以做到主动式远程入侵，RPC级别的漏洞被誉为漏洞中的王者，此类漏洞也极其稀有，每一个都有一段曲折的故事。值得一提的是最近的两个RPC系统漏洞竟然出自同一个函数。本章将对这个缝来补去没有修好的函数进行详细分析，让您从攻防两方面深刻理解漏洞的起因和修复策略的重要性。
第27章  MS06-055分析：实战Heap Spray
通过网页“挂马”是近年来攻击者惯用的手法。本章通过分析微软IE浏览器中真实的缓冲区溢出漏洞，告诉您为什么不能随便点击来历不明的URL链接，并在实战中为大家演示Heap Spray技术。
第28章  MS09-032分析：一个“&”引发的血案 
一个视频网页的背后可能是一只凶狠的木马，这就是著名的Microsoft DirectShow MPEG-2视频ActiveX控件远程代码执行漏洞。本章将为您分析该漏洞产生的原因及分析技巧。
第29章  Yahoo!Messenger栈溢出漏洞 
在波涛汹涌的溢出大潮中Yahoo也没能幸免，作为国外非常流行的Yahoo!Messenger也存在过非常严重的漏洞。本章将重现当时的场景，并分析漏洞产生的原因。
第30章  CVE-2009-0927：PDF中的JS 
您可能不会随便运行一个可执行文件，但是您会想到别人发过来的PDF文档中也有可能隐藏着一些东西吗？本章将以PDF文档为例，带您领略文件类型溢出漏洞的风采。
第31章  坝之蚁穴：超长URL溢出漏洞 
安全软件不一定安全，即便是这款保护未成年人健康上网的计算机终端过滤软件，也有可能成为黑客攻击的窗口。本章将介绍绿坝软件中一个已经被修复了的安全漏洞。
第32章  暴风影音M3U文件解析漏洞 
晚上回家后用暴风影音打开别人发过来的M3U列表文件，在你陶醉于其内容之时，一只精干的小马已悄然在后台运行。想要了解这只小马是如何进入你的电脑的？请阅读本章。
第33章  LNK快捷方式文件漏洞
是否我不去运行任何可疑文件，不去打开陌生的网址就安全了呢？答案是否定。LNK快捷方式漏洞无需打开文件，只要浏览恶意文件，所在文件夹就会中毒，俗称“看一眼就挂”。本章将带您分析这一神奇的漏洞。
Failwest
目 录
第1篇  漏洞利用原理（初级）
第1章  基础知识 2
1.1  漏洞概述 2
1.1.1  bug与漏洞 2
1.1.2  几个令人困惑的安全问题 2
1.1.3  漏洞挖掘、漏洞分析、漏洞利用 3
1.1.4  漏洞的公布与0 day响应 5
1.2  二进制文件概述 5
1.2.1  PE文件格式 5
1.2.2  虚拟内存 6
1.2.3  PE文件与虚拟内存之间的映射 7
1.3  必备工具 11
1.3.1  OllyDbg简介 11
1.3.2  SoftICE简介 11
1.3.3  WinDbg简介 16
1.3.4  IDA Pro简介 18
1.3.5  二进制编辑器 20
1.3.6  VMware简介 21
1.3.7  Python编程环境 28
1.4  Crack小实验 29
第2章  栈溢出原理与实践 38
2.1  系统栈的工作原理 38
2.1.1  内存的不同用途 38
2.1.2  栈与系统栈 39
2.1.3  函数调用时发生了什么 40
2.1.4  寄存器与函数栈帧 43
2.1.5  函数调用约定与相关指令 44
2.2  修改邻接变量 47
2.2.1  修改邻接变量的原理 47
2.2.2  突破密码验证程序 49
2.3  修改函数返回地址 53
2.3.1  返回地址与程序流程 53
2.3.2  控制程序的执行流程 57
2.4  代码植入 62
2.4.1  代码植入的原理 62
2.4.2  向进程中植入代码 62
第3章  开发shellcode的艺术 71
3.1  shellcode概述 71
3.1.1  shellcode与exploit 71
3.1.2  shellcode需要解决的问题 72
3.2  定位shellcode 73
3.2.1  栈帧移位与jmp esp 73
3.2.2  获取“跳板”的地址 76
3.2.3  使用“跳板”定位的exploit 78
3.3  缓冲区的组织 81
3.3.1  缓冲区的组成 81
3.3.2  抬高栈顶保护shellcode 83
3.3.3  使用其他跳转指令 83
3.3.4  不使用跳转指令 84
3.3.5  函数返回地址移位 85
3.4  开发通用的shellcode 87
3.4.1  定位API的原理 87
3.4.2  shellcode的加载与调试 88
3.4.3  动态定位API地址的shellcode 89
3.5  shellcode编码技术 98
3.5.1  为什么要对shellcode编码 98
3.5.2  会“变形”的shellcode 99
3.6  为shellcode“减肥” 103
3.6.1  shellcode瘦身大法 103
3.6.2  选择恰当的hash算法 105
3.6.3  191个字节的bindshell 107
第4章  用MetaSploit开发Exploit 119
4.1  漏洞测试平台MSF 简介 119
4.2  入侵Windows系统 121
4.2.1  漏洞简介 121
4.2.2  图形界面的漏洞测试 121
4.2.3  console界面的漏洞测试 125
4.3  利用MSF制作shellcode 126
4.4  用MSF扫描“跳板” 128
4.5  Ruby语言简介 129
4.6 “傻瓜式”Exploit开发 134
4.7  用MSF发布POC 140
第5章  堆溢出利用 144
5.1  堆的工作原理 144
5.1.1  Windows堆的历史 144
5.1.2  堆与栈的区别 145
5.1.3  堆的数据结构与管理策略 146
5.2  在堆中漫游 151
5.2.1  堆分配函数之间的调用关系 151
5.2.2  堆的调试方法 152
5.2.3  识别堆表 155
5.2.4  堆块的分配 158
5.2.5  堆块的释放 159
5.2.6  堆块的合并 159
5.2.7  快表的使用 161
5.3  堆溢出利用（上）——DWORD SHOOT 163
5.3.1  链表“拆卸”中的问题 163
5.3.2  在调试中体会“DWORD SHOOT” 165
5.4  堆溢出利用（下）——代码植入 169
5.4.1  DWORD SHOOT的利用方法 169
5.4.2  狙击P.E.B中RtlEnterCritical-Section()的函数指针 170
5.4.3  堆溢出利用的注意事项 175
第6章  形形色色的内存攻击技术 178
6.1  狙击Windows异常处理机制 178
6.1.1  S.E.H概述 178
6.1.2  在栈溢出中利用S.E.H 180
6.1.3　在堆溢出中利用S.E.H 184
6.1.4　深入挖掘Windows异常处理 187
6.1.5　其他异常处理机制的利用思路 192
6.2 “off by one”的利用 196
6.3　攻击C++的虚函数 198
6.4　Heap Spray：堆与栈的协同攻击 201
第7章  手机里的缓冲区溢出 204
7.1  Windows Mobile简介 204
7.1.1  Windows Mobile前世今生 204
7.1.2  Windows Mobile架构概述 205
7.1.3  Windows Mobile的内存管理 209
7.2  ARM简介 212
7.2.1  ARM是什么 212
7.2.2  ARM寄存器结构 212
7.2.3  ARM汇编指令结构 215
7.2.4  ARM指令寻址方式 220
7.2.5  ARM的函数调用与返回 222
7.3  Windows Mobile上的HelloWorld 223
7.4  远程调试工具简介 227
7.4.1  远程信息查看管理套件 227
7.4.2  手机上的调试——Microsoft Visual Studio 231
7.4.3  手机上的调试——IDA 233
7.5  手机上的exploit me 237
第8章  其他类型的软件漏洞 243
8.1　格式化串漏洞 243
8.1.1　printf中的缺陷 243
8.1.2　用printf读取内存数据 244
8.1.3　用printf向内存写数据 245
8.1.4　格式化串漏洞的检测与防范 246
8.2　SQL注入攻击 247
8.2.1　SQL注入原理 247
8.2.2　攻击PHP+MySQL网站 248
8.2.3　攻击ASP+SQL Server网站 250
8.2.4　注入攻击的检测与防范 252
8.3　其他注入方式 253
8.3.1　Cookie注入，绕过马其诺防线 253
8.3.2　XPath注入，XML的阿喀琉斯之踵 254
8.4　XSS攻击 255
8.4.1　脚本能够“跨站”的原因 255
8.4.2　XSS Reflection攻击场景 256
8.4.3　Stored XSS攻击场景 258
8.4.4　攻击案例回顾：XSS蠕虫 258
8.4.5　XSS的检测与防范 259
8.5  路径回溯漏洞 260
8.5.1  路径回溯的基本原理 260
8.5.2  范式化与路径回溯 261
第2篇  漏洞利用原理（高级）
第9章  Windows安全机制概述 264
第10章  栈中的守护天使：GS 267
10.1  GS安全编译选项的保护原理 267
10.2  利用未被保护的内存突破GS 271
10.3  覆盖虚函数突破GS 273
10.4  攻击异常处理突破GS 276
10.5  同时替换栈中和.data中的Cookie突破GS 280
第11章  亡羊补牢：SafeSEH 284
11.1  SafeSEH对异常处理的保护原理 284
11.2  攻击返回地址绕过SafeSEH 288
11.3  利用虚函数绕过SafeSEH 288
11.4  从堆中绕过SafeSEH 288
11.5  利用未启用SafeSEH模块绕过SafeSEH 292
11.6  利用加载模块之外的地址绕过SafeSEH 299
11.7  利用Adobe Flash Player ActiveX控件绕过SafeSEH 305
第12章  数据与程序的分水岭：DEP 313
12.1  DEP机制的保护原理 313
12.2  攻击未启用DEP的程序 316
12.3  利用Ret2Libc挑战DEP 317
12.3.1  Ret2Libc实战之利用ZwSetInformationProcess 318
12.3.2  Ret2Libc实战之利用VirtualProtect 330
12.3.3  Ret2Libc实战之利用VirtualAlloc 339
12.4  利用可执行内存挑战DEP 348
12.5  利用.NET挑战DEP 352
12.6  利用Java applet挑战DEP 359
第13章  在内存中躲猫猫：ASLR 363
13.1  内存随机化保护机制的原理 363
13.2  攻击未启用ASLR的模块 367
13.3  利用部分覆盖进行定位内存地址 372
13.4  利用Heap spray技术定位内存地址 376
13.5  利用Java applet heap spray技术定位内存地址 379
13.6  为.NET控件禁用ASLR 382
第14章  S.E.H终极防护：SEHOP 386
14.1  SEHOP的原理 386
14.2  攻击返回地址 388
14.3  攻击虚函数 388
14.4  利用未启用SEHOP的模块 388
14.5  伪造S.E.H链表 390
第15章  重重保护下的堆 396
15.1  堆保护机制的原理 396
15.2  攻击堆中存储的变量 397
15.3  利用chunk重设大小攻击堆 398
15.4  利用Lookaside表进行堆溢出 407
第3篇  漏洞挖掘技术
第16章  漏洞挖掘技术简介 414
16.1  漏洞挖掘概述 414
16.2  动态测试技术 415
16.2.1  SPIKE简介 415
16.2.2  beSTORM简介 421
16.3　静态代码审计 429
第17章  文件类型漏洞挖掘 与Smart Fuzz 431
17.1  Smart Fuzz概述 431
17.1.1  文件格式Fuzz的基本方法 431
17.1.2  Blind Fuzz和Smart Fuzz 432
17.2  用Peach挖掘文件漏洞 433
17.2.1  Peach介绍及安装 433
17.2.2  XML介绍 434
17.2.3  定义简单的 Peach Pit 436
17.2.4  定义数据之间的依存关系 440
17.2.5  用Peach Fuzz PNG文件 441
17.3  010脚本，复杂文件解析的瑞士军刀 446
17.3.1  010 Editor简介 446
17.3.2  010脚本编写入门 447
17.3.3  010脚本编写提高——PNG文件解析 449
17.3.4  深入解析，深入挖掘——PPT文件解析 452
第18章  FTP的漏洞挖掘 457
18.1  FTP协议简介 457
18.2  漏洞挖掘手记1：DOS 457
18.3  漏洞挖掘手记2：访问权限 466
18.4  漏洞挖掘手记3：缓冲区溢出 468
18.5  漏洞挖掘手记4：Fuzz DIY 472
第19章  E-Mail的漏洞挖掘 477
19.1  挖掘SMTP漏洞 477
19.1.1  SMTP协议简介 477
19.1.2  SMTP漏洞挖掘手记 478
19.2  挖掘POP3漏洞 480
19.2.1  POP3协议简介 480
19.2.2  POP3漏洞挖掘手记 481
19.3  挖掘IMAP4漏洞 489
19.3.1  IMAP4协议简介 489
19.3.2  IMAP4漏洞挖掘手记 490
19.4  其他E-mail漏洞 491
19.4.1  URL中的路径回溯 491
19.4.2  内存中的路径回溯 494
19.4.3  邮件中的XSS 500
第20章  ActiveX控件的漏洞挖掘 502
20.1  ActiveX控件简介 502
20.1.1  浏览器与ActiveX控件的关系 502
20.1.2  控件的属性 503
20.2  手工测试ActiveX控件 504
20.2.1  建立测试模板 504
20.2.2  获取控件的接口信息 505
20.3  用工具测试ActiveX控件：COMRaider 509
20.4  挖掘ActiveX漏洞 516
20.4.1  ActiveX漏洞的分类 516
20.4.2  漏洞挖掘手记1：超星阅读器溢出 517
20.4.3  漏洞挖掘手记2：目录操作权限 521
20.4.4  漏洞挖掘手记3：文件读权限 523
20.4.5  漏洞挖掘手记3：文件删除权限 525
第4篇  操作系统内核安全
第21章  探索ring0 528
21.1  内核基础知识介绍 528
21.1.1  内核概述 528
21.1.2  驱动编写之Hello World 528
21.1.3  派遣例程与IRP结构 533
21.1.4  Ring3打开驱动设备 537
21.1.5  DeviceIoControl函数与IoControlCode 538
21.1.6  Ring3/Ring0的四种通信方式 539
21.2  内核调试入门 541
21.2.1  创建内核调试环境 541
21.2.2  蓝屏分析 549
21.3  内核漏洞概述 551
21.3.1  内核漏洞的分类 551
21.3.2  内核漏洞的研究过程 553
21.4  编写安全的驱动程序 555
21.4.1  输入输出检查 555
21.4.2  验证驱动的调用者 556
21.4.3  白名单机制的挑战 556
第22章  内核漏洞利用技术 557
22.1  利用实验之exploitme.sys 557
22.2  内核漏洞利用思路 559
22.3  内核漏洞利用方法 560
22.4  内核漏洞利用实战与编程 565
22.5  Ring0 Shellcode的编写 570
第23章  FUZZ驱动程序 579
23.1  内核FUZZ思路 579
23.2  内核FUZZ工具介绍 581
23.3  内核FUZZ工具DIY 583
23.3.1  Fuzz对象、Fuzz策略、Fuzz项 583
23.3.2  IoControl MITM Fuzz 583
23.3.3  IoControl Driver Fuzz 585
23.3.4  MyIoControl Fuzzer界面 586
23.4  内核漏洞挖掘实战 588
23.4.1  超级巡警ASTDriver.sys本地提权漏洞 588
23.4.2  东方微点mp110013.sys本地提权漏洞 594
23.4.3  瑞星HookCont.sys驱动本地拒绝服务漏洞 601
第24章  内核漏洞案例分析 605
24.1  远程拒绝服务内核漏洞 605
24.2  本地拒绝服务内核漏洞 611
24.3  缓冲区溢出内核漏洞 614
24.4  任意地址写任意数据内核漏洞 619
24.5  任意地址写固定数据内核漏洞 622
第5篇  漏洞分析案例
第25章  漏洞分析技术概述 628
25.1  漏洞分析的方法 628
25.2运动中寻求突破：调试技术 629
25.2.1  断点技巧 630
25.2.2  回溯思路 644
25.3　用“白眉”在PE中漫步 647
25.3.1　指令追踪技术与Paimei 647
25.3.2　Paimei的安装 648
25.3.3　使用PE Stalker 649
25.3.4　迅速定位特定功能对应的代码 652
25.4　补丁比较 654
第26章  RPC入侵：MS06-040 与MS08-067 658
26.1  RPC漏洞 658
26.1.1  RPC漏洞简介 658
26.1.2  RPC编程简介 658
26.2  MS06-040 659
26.2.1  MS06-040简介 659
26.2.2  动态调试 660
26.2.3  静态分析 667
26.2.4  实现远程exploit 670
26.3  Windows XP环境下的MS06-040 exploit 677
26.3.1  静态分析 677
26.3.2  蠕虫样本的exploit方法 682
26.3.3  实践跨平台exploit 684
26.4  MS08-067 690
26.4.1  MS08-067简介 690
26.4.2  认识Legacy Folder 693
26.4.3 “移经”测试 694
26.4.4 “移经”风险 695
26.4.5  POC的构造 696
26.5  魔波、Conficker与蠕虫病毒 703
第27章  MS06-055分析：实战Heap Spray 705
27.1　MS06-055简介 705
27.1.1　矢量标记语言（VML）简介 705
27.1.2　0 day安全响应纪实 706
27.2　漏洞分析 707
27.3  漏洞利用 710
第28章  MS09-032分析：一个“&”引发的血案 713
28.1  MS09-032简介 713
28.2  漏洞原理及利用分析 713
第29章  Yahoo!Messenger栈 溢出漏洞 719
29.1  漏洞介绍 719
29.2  漏洞分析 719
29.3  漏洞利用 723
第30章  CVE-2009-0927：PDF中的JS 725
30.1  CVE-2009-0927简介 725
30.2  PDF文档格式简介 725
30.3  漏洞原理及利用分析 727
第31章  坝之蚁穴：超长URL溢出漏洞 731
31.1  漏洞简介 731
31.3  漏洞原理及利用分析 731
第32章  暴风影音M3U文件解析漏洞 737
32.1  漏洞简介 737
32.2  M3U文件简介 737
32.3  漏洞原理及利用分析 738
第33章  LNK快捷方式文件漏洞 744
33.1  漏洞简介 744
33.2  漏洞原理及利用分析 744
附录A  已公布的内核程序漏洞列表 750
参考文献 753