毕业论文-软件漏洞分析与利用的研究_第1页
毕业论文-软件漏洞分析与利用的研究_第2页
毕业论文-软件漏洞分析与利用的研究_第3页
毕业论文-软件漏洞分析与利用的研究_第4页
毕业论文-软件漏洞分析与利用的研究_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件漏洞分析与利用的研究摘要现如今,网络市场上的软件琳琅满目,程序员用自己的程序开发出自己的软件,在软件市场上开拓出自己的一片天空,开发了满足不同用户、不同需求的各种软件,实现了各种不同的功能,方便了人们的生活,解决了生活中遇到的难题,让软件的自动化代替人工的繁琐,不仅省时,而且省力,为人类的生产、生活的发展奠定了坚实的基础。软件的设计是程序员的心血,但是人类的思维是有限的,时代的发展是无限的,新事物的发展更是无限的,软件就会暴露出不同的漏洞。黑客们每天精心地进行漏洞的挖掘与分析,再对漏洞进行处理以及漏洞利用,就能够远程的攻击目标主机,甚至于拿到目标主机的管理员权限,随意篡改目标主机的数据,造成目标主机的数据丢失或操作的错误。从而给目标主机的操作人员造成巨大的数据丢失以及经济损失。本设计采用METASPLOIT软件结合RUBY语言进行主要的攻击工具开发,使用IDAPROADVANCED进行软件漏洞反编译,同时运用OLLDBG进行动态调试分析。论文主要分为两大部分一个是软件的漏洞分析部分,另一个是软件漏洞利用部分。漏洞分析部分主要实现对缓冲区溢出的栈溢出原理进行分析,针对通用的软件漏洞,进行通用合理化的漏洞分析;软件漏洞利用部分主要利用两个攻击实例,第一个是针对MS12_020漏洞利用,成功入侵主机,对主机进行破坏性的蓝屏攻击。第二个是针对MS08_067漏洞利用,在自由网络中,成功攻击带有此漏洞的目标主机,查看主机的IP,查看主机的文件目录,修改文件名称,在目标主机上添加用户,并进一步提升至管理员权限,开启后门服务,登陆远程目标主机桌面等。真正成功实现了漏洞的利用过程,模拟黑客攻击的全过程。关键词漏洞分析漏洞利用提升权限文件读取远程登陆桌面THERESEARCHOFBOTHSOFTWAREVULNERABILITYANALYSISANDEXPLOITSABSTRACTNOWADAYS,THEREAREALLSORTSOFSOFTWARESONTHENETWORKMARKETPROGRAMMERSUSEITSOWNPROCEDURESTODEVELOPHISOWNSOFTWARE,TODEVELOPTHEIROWNPIECEOFTHESKYINTHESOFTWAREMARKET,TOMEETTHEDIFFERENTUSERS,DIFFERENTNEEDSOFVARIOUSSOFTWAREDEVELOPMENT,TOACHIEVEAVARIETYOFDIFFERENTFUNCTIONS,CONVENIENCETOPEOPLESLIFE,TOSOLVETHEPROBLEMSENCOUNTEREDDURINGLIFE,MAKEAUTOMATEDSOFTWARETOREPLACEMANUALTAPE,NOTONLYSAVETIME,BUTALSOSAVINGSTRENGTH,LAIDASOLIDFOUNDATIONFORTHEDEVELOPMENTOFBOTHTHEHUMANSPRODUCTIONANDTHEHUMANSLIFETHESOFTWAREDESIGNISTHEPROGRAMMEREFFORTBUTTHEHUMANMINDISLIMITED,THEDEVELOPMENTOFTHETIMESISINFINITE,THEDEVELOPMENTOFNEWTHINGSAREINFINITE,THESOFTWAREWILLEXPOSEDIFFERENTVULNERABILITYCAREFULLYMININGANDANALYZINGTHELOOPHOLESBYTHEHACKERS,LOOPHOLESCANBEPROCESSEDANDEXPLOITED,HACKERSCANATTACKTHETARGETHOSTWITHOUTADMINISTRATORPERMISSIONS,EVENGETTHEADMINISTRATIONOFTHETARGETHOST,TAMPERTHETARGETHOSTDATA,RESULTINGINTHETARGETHOSTDATALOSSORERRORTHISMAYRESULTINHUGEDATALOSSANDECONOMICLOSSTOTHETARGETHOSTOPERATORTHISPROCEDUREUSINGMETASPLOITSOFTWARECOMBINEDWITHRUBYLANGUAGETODEVELOPMENTTHEATTACKMODULE,USETHEIDAPROADVANCEDSOFTWARETODECOMPILESOFTWAREVULNERABILITIES,WHILEUSEOFOLLDBGSOFTWARETODYNAMICDEBUGGINGANALYSISTHEDESIGNISDIVIDEDINTOTWOPARTSONEISAPARTOFANALYSISSOFTWAREVULNERABILITIES,THEOTHERISTHEPARTEXPLOITTHESOFTWAREVULNERABILITIESPARTOFTHEVULNERABILITYANALYSISSTACKOVERFLOWTHEBUFFEROVERFLOWISANALYZED,BASEDONGENERALANALYSISSOFTWAREVULNERABILITIES,GENERALRATIONALLOOPHOLESSOFTWAREVULNERABILITYEXPLOITSMAINLYUSETWOATTACKINSTANCES,THEFIRSTISFORTHEMS12_020EXPLOIT,SUCCESSFULINVASIONOFHOST,DESTRUCTIVEATTACKSONTHEHOSTSCREENTHESECONDISFORTHEMS08_067EXPLOITINTHEFREENETWORK,ASUCCESSFULATTACKWITHTHEVULNERABILITYOFTHETARGETHOST,THEHOSTIP,VIEWTHEHOSTFILEDIRECTORY,CHANGETHEFILENAME,ADDAUSERINTHETARGETHOST,ANDFURTHERINCREASETOADMINISTRATORPRIVILEGES,OPENTHEBACKDOORSERVICE,LANDINGONTHETARGETHOST,REMOTEDESKTOPTHESUCCESSFULIMPLEMENTATIONOFTHEPROCESSOFREALVULNERABILITY,WHOLEPROCESSSIMULATIONOFHACKERATTACKKEYWORDSVULNERABILITYANALYSISEXPLOITELEVATEDPERMISSIONSFILEREADREMOTEDESKTOP目录第一章绪论111软件漏洞的概述112软件漏洞的挖掘技术113软件漏洞的分析原理214漏洞的利用方法215本课题研究的目的与意义216本文的组织和结构3第二章渗透测试与安全漏洞421渗透测试概述4211渗透测试的起源4212渗透测试的概念与分类4213渗透测试的方法体系标准5214PTES渗透测试过程环节622安全漏洞概述7221安全漏洞生命周期7222安全漏洞披露方式8223安全漏洞公共资源库823本章小结9第三章软件漏洞栈溢出原理分析1031二进制文件概述10311PE文件格式10312虚拟内存11313PE文件与虚拟内存之间的映射1232系统栈的工作原理14321进程的内存14322栈和系统栈15323函数的调用过程16324寄存器与函数栈帧19325函数调用约定与相关指令20326利用OD查看PE文件装载进入内存的效果23326INVOKE指令分解2433SHELLCODE的开发2434缓冲区溢出实例解析3035本章小结32第四章利用METASPLOIT软件和RUBY语言实现漏洞利用3341METASPLOIT软件介绍33411METASPLOIT体系框架33412METASPLOIT体系内容3442RUBY语言介绍35421RUBY语言发展史35422RUBY语言的特点3543METASPLOIT与RUBY攻击语言结合进行漏洞利用3544本章小结36第五章MS12_020漏洞利用实例3751漏洞利用环境的软硬件介绍3752MS12_020漏洞分析实例37521MS12_020漏洞概述37522MS12_020漏洞源代码结构解析3853MS12_020漏洞实例过程4054本章小结43第六章MS08_067漏洞利用实例4461漏洞利用环境的软硬件介绍4462MS08_067漏洞分析实例44621MS08_067漏洞概述44622MS08_067漏洞源代码结构解析4563MS08_067漏洞实例过程4864本章小结56第七章总结与展望5771本文总结5772不足与展望58参考文献59致谢60第一章绪论11软件漏洞的概述当前时代,软件开发工业的迅猛发展,软件的生产规模的不断扩大,其内部编辑的逻辑结构也将越来越具体化。虽然这样,不论从理论的角度上看,还是从功能的角度上看,人类逻辑思维的缺陷都会随着新事物的产生而暴露出来,从而,没有人能够设计出完美无缺的软件。因此,软件的漏洞就暴露出来了。在市面上各种的软件的逻辑缺陷中,有一部分只能获取很小权限的功能,而有一部分能够引起非常严重的后果。例如,网站页面后台设置中,存在用户输入数据限制方面的缺陷,那么可能会出现XSS攻击和SOL注入攻击,服务器在解析数据包的时候,当解析出非同一般的数据格式,而处理不当时,就会被黑客远程控制,读取隐私数据1。一般的,我们将软件漏洞分成大概的两个类别1功能上的逻辑缺陷漏洞破坏软件常规的执行操作,例如,执行过程的跳转、图像查看的错误等2。2安全上的逻辑缺陷漏洞正常状态下不会影响软件的正常功能,但是被黑客攻击之后,将会造成溢出之后的恶意代码的执行。普遍的软件漏洞一句话木马入侵网站漏洞、缓冲区溢出漏洞、SQL注入漏洞、网站中的跨站脚本漏洞、和暴库漏洞等1。12软件漏洞的挖掘技术安全问题的漏洞不会对软件的正常执行操作有异常的侵入,因此,测试工程师的在进行功能性测试时,普通的测试,是不容易被发现的,站在正在进行正常办公的使用者的角度上看,也很难会发现,因此也不会体验到被入侵的感觉。对于很多高危漏洞,漏洞的价值很高,例如,数据库数据泄露、计算机被非法控制等,所以对于那些技术超高,有充足精力和时间的黑客们,就在不停地寻找软件中的未知漏洞,他们精通二进制汇编语言和操作系统底层调用的原理,他们往往能够根据出人意料的思考方式,捕捉到程序员思维的缺陷3。不是整体做攻击测试的人都是“黑客”。大规模软件开发公司也会特别招一些专门测试安全的人来测试攻击自己产品软件中的漏洞问题,即攻击测试,专门做这些测试工作的团队人员被称作“老虎队”。从测试技术的问题上看,漏洞挖掘被当做是特殊的高级的测试技术。在学术领域,更加通用的方式是静态分析法,来侦查源代码中容易出现的功能性漏洞;而在工程领域,不管是测试者还是破坏者,通常使用的手段是FUZZ测试技术,本质上,是一种特殊的“灰”盒测试1。13软件漏洞的分析原理在FUZZ功能性测试的过程中,侦查出软件中一种十分特殊的破坏操作时,可以透过厂商发出实用的漏洞基本的过程描述,黑客们利用一定的漏洞分析能力,来对漏洞进行逆向分析,通常情况,需要对程序进行逆向分析行成二进制级别的程序。在漏洞分析的过程中,需要尽力追踪到POC部分的代码,即可实现达到漏洞爆发的先决条件。这时,可以利用工具来详细的观察漏洞分析过程,或者借助特殊工具更快捷地查找到漏洞的爆发之处的出发点1。当POC没有被发现的时候,必须依靠深入地理解与研究厂商对漏洞的“简单的叙述”。使用“补丁比较器”是一个相对有用的方法。开始时,需要进行可执行文件在特定的被修改之前和之后的位置数值比较,然后使用特殊的破解的“比较工具”重点进行软件的逆向分析的过程。因此,软件的分析原理问题需要很高能力的调试功能技术和逆向分析技术,还有不同的环境下所需要使用的漏洞利用的方式与方法,过程中更依赖的是调试的作用,不断积累经验,并没有统一的测试方法。14漏洞的利用方法缓冲区溢出漏洞的利用技术始源于1980年左右。而这种技术普遍通用的时期,是在SMASHINGTHESTACKFORFUNANDPROFIT的公布发表之后1。漏洞利用是针对漏洞分析进行的下一步操作,比较隐蔽的漏洞利用方法是内核的漏洞利用,其中也有两种不同的方法1篡改内核内存数据这种方法并不推荐,因为很多重要的内核内存数据都是不可直接被改写的,如果内存所在页属性是只读文件,CR0寄存器的WP位设置为1,是不能直接写入内存的寄存器中,所以如果需要改变内存中的值,需要采用第二种方法,在RING0SHELLCODE中,首先将CR0寄存器的WP位置为0,即禁用内存保护,篡改完后,再恢复WP位即可1。2执行RING0SHELLCODE其中执行者主体是RING0程序,不能是RING3程序,其权限不够资格,我们知道内核中,RING0包含许多API函数,其地址大多保存在一些表中,并且这些表同样由内核导出1。想要达到的效果是修改这些表中,将SHELLCODE存放地址改为内核API函数地址,接下来,继续调用本进程,不仅如此,一定要选择那些相对较“不常用”的函数作为内核API函数,最好是那些不常被访问的函数。别的进程无法访问到我们的SHELLCODE,因为它保存在自己进程的RING3内存地址中,一旦别的进程也需要调用这个API函数时,最后致使内存访问错误甚至内核崩溃,对于系统,是相当危险的1。15本课题研究的目的与意义目前软件的安全性是与任何一个操作者的敏感数据、信息的安全息息相关的。网络中的各种漏洞被黑客利用后危害是相当大的,甚至于以一台主机去感染成千上万台主机的方式进行漏洞利用。所以软件漏洞的分析与利用是相当有必要的。研究本课题,主要是针对目前能够执行远程控制的漏洞进行深入的分析与理解,将漏洞利用的过程和原理进行重现,并详细解析攻击模块的过程原理以及实例过程。通过案例实况重现,对软件漏洞中缓冲区溢出和动态调试基本方法进行深一步的理解。漏洞的利用主要能够利用工具实现在目标主机上添加用户,并进一步提升至管理员权限,能够对目标主机的文件进行查看,能够修改指定目录下的文件名称,开启后门服务,登陆远程目标主机桌面等。16本文的组织和结构第一章总体对软件漏洞进行简单的介绍,对软件漏洞挖掘技术、软件漏洞分析技术、以及软件漏洞利用技术进行初步简单的介绍,并针对研究的课题出发点和目的进行总结和归纳。第二章对渗透测试与安全漏洞做了详细的介绍,从渗透测试的起源、概念、分类、执行标准和具体流程进行了详细的阐述,对安全漏洞的周期,披露方式和公共资源库进行了简要的阐述。第三章对软件漏洞中栈溢出原理进行详细分析,其中包括漏洞分析中二进制文件的介绍,PE文件的组成结构,PE文件和虚拟内存之间的对应关系,以及系统栈的工作原理,内存的调用方式,栈与系统栈的关系,函数调用的具体过程,寄存器与函数栈帧的关系,函数调用约定与相关指令等,最后一节用实际的缓冲区溢出的小的实例进行栈溢出原理的漏洞演示,能够更深刻的领会前述原理的过程。第四章对METASPLOIT和RUBY语言进行简要概述,并对其相互结合利用,成功攻击目标主机的原理进行了分析了解。第五章对MS12_020漏洞进行了详细的漏洞分析以及漏洞利用过程的展示。第六章对MS08_067漏洞进行了详细的漏洞分析以及漏洞利用过程的展示。第七章对全文的总结概括,对实际论文中总结的一些原理性的知识点的篇章总结。除此之外,又提出一些缺点和不足。第二章渗透测试与安全漏洞21渗透测试概述211渗透测试的起源在美国的军事演习中,假想敌与美国军队分别作为“红队”和“蓝队”,首先融入了美国国家安全局与美国军队,进行信息安全基础设施与信息网络的实际攻防测试,由一群接受国家安全培训的“红队”与接受测试防御的“蓝队”进行互相攻击,以实际对战的手段来检验安全响应计划与安全防护体系的有效性,而后,国家专门培养一批职业化的“红队”,来维护国家信息的安全2。212渗透测试的概念与分类1渗透测试概念渗透测试是模拟恶意攻击者实战的渗透技术,攻击目标主机系统,获得访问控制权限,以测试和评价的方法,对潜在的安全风险进行评估的过程4。2渗透测试分类渗透测试的分类,如表21所示表21渗透测试的分类定义完全仿真一个毫无攻击目标网络结构测试的攻击者而做的测试5。过程渗透测试团队将从一个远程网络位置来评估目标网络基础设施,并没有任何目标网络内部的拓扑结构,他们完全模拟真实网络环境的外部攻击者,采用流行的攻击技术及工具,有组织,有步骤的进行渗透与入侵,揭示目标网络中一些已知或未知的安全漏洞,并对这些漏洞能否利用并获得控制权限或造成而无资产损失进行评估2。黑盒测试特点黑盒测试是比较费力的,同时需要渗透测试者具备较好的技术能力。从安全领域的攻击者的角度去看,黑盒测试普遍更瘦追捧,是由于它能更加真实的再现攻击实战的全部过程与步骤4。213渗透测试的方法体系标准现在,世界领域相对公开,开源的“渗透测试方法”的体系准则,如表22所示表22开源渗透测试方法体系标安全测试方法学开源手册(OSSTTM)由“安全与公开方法学”研究所制定的标准,提供人类心理学、物理安全、无线通信媒介、电讯通信和数据网络这些测试广泛的应用实例,并给出渗透测试的评估指标的标准2。NISTSP80042网络安全测试指南美国国家标准与技术研究院(NIST)在SP80042网络安全测试指南中,讨论了测试流程与方法,虽然不及OSSTMM全面,但是更可能被管理部门所接受2。OWESP十大WEB应用安全威胁项目针对目前最普遍的WEB应用层,为安全测试人员和开发者提供了如何辨识与避免这些安全威胁的指南,OWESP十大WEB应用安全威胁项目(OWESPTOPTEN)只关注最高风险的WEB领域,而不是一个普遍性的渗透测试方法指南2。WEB安全威胁分类标准与OWESPTOPTEN类似,WEB应用安全分类标准(WASCTC全面地给出了目前WEB应用领域中的漏洞、攻击与防范措施视图2。PTES渗透测试2010年最先发起的渗透测试过程规范标准项目,核心理念是通过建立起进定义攻击者完整的知晓被攻击一方的全部网络拓扑结构的测试6。过程进行白盒测试的团队可以了解关于目标环境的所有内部与底层知识,以最小的代价发现和验证系统中最严重的安全漏洞。白盒测试特点比“黑盒”消除更多的被入侵的主机的安全漏洞,而后,能够更多的创造出更有力的价值。再加上,测试过程中不需要定位主机,也不需要侦查网络结构,但却能够一次性的定位攻击测试的方式,从而能够避免浪费时间与精力的资源,直接查出安全漏洞,从而防止黑客的利用与攻击。概念以上两种测试的组合,可以对目标系统进行更深入和安全的审查2。过程即白盒与黑盒的组合。灰盒测试特点将两种测试方式的优势相结合,“灰盒测试”能够所掌握的有限的情报和资料,决定实际攻击与测试的实践方式,从而确定安全评估的最佳方式。同时,测试者同时必须要从外网实际逐渐渗透,成功进入目标主机,不过熟悉目标系统主机的网络底层拓扑结构,能够更好地提出攻击途径和方法2。执行标准行渗透测试的基本准则准线,来定义一次真正的渗透测试过程,并得到安全界的广泛认同2。214PTES渗透测试过程环节很多知名的安全领域的企业,一起组织发起了PTES渗透测试的执行方式的准则,目的是制定渗透测试的普遍描述的基本准则规范。具体阶段,如表23所示表23PTES渗透测试过程环节过程渗透测试团队人员通过与客户的相互沟通与合作,找准渗透测试的测试范围,条件领域,限制约束和约定条约2。前期交互阶段内容主要规定的工作内容是沟通用户需求,确定渗透方案、划定攻击范围边界、确定攻击目标等工作2。过程划定锁定的空间之后,将经历细节收录时期,团队人员能够运用不同的信息与测试方式,试图获得更多关于目标组织中的主机信息、网络信息以及使用的情况。情报搜集阶段内容攻击者使用情报搜集的方法,包括公开来源信息查询、GOOGLEHACKING、社会工程学、网络踩点、扫描探测、被动监听、服务查点2。过程在搜集到充分的情报信息之后,渗透测试团队针对信息,进行威胁建模与攻击规划、这是非常重要的部分,却又是最容易被忽视的环节2。威胁建模阶段内容经由渗透测试者专注的情报搜集的模拟攻击方式的过程,能够将可行的攻击方式从海量的数据中提取出来,最终定下攻击方式。过程经过最终定下的攻击方式,应用于下一步要考虑怎样获取目标主机的访问控制权限。漏洞分析阶段内容攻击者需要收集可发生渗透测试的攻击代码,主要是将漏洞经过检测后的扫描结果以及可以利用的资料,通过分析可以发生漏洞的部分代码,查到可以进行攻击的入手点,并在测试中得到证明。过程攻击实践过程中最重要的步骤。渗透测试者需要利用他们所找出的目标主机的漏洞,来真正入侵到其中,而获得访问控制权限。渗透攻击阶段内容渗透攻击可以利用网络平台获得渗透代码,但要根据特定的主机的不同特点,去实施下一步的攻击,这样就可以实现成功的渗透攻击了2。过程最可以展示出攻击者们之间的众人合作精神和技能水平的重要步骤,攻击者们需要根据目标组织的资产保护方式、安全防护设置、生产方式的组织的特征,自主设计出攻击目标,识别关键基础设施,努力找寻目标中最有作用和需要进行防护的信息和资产,以至于实现对目标系统的影响的实施过程2。后渗透攻击阶段注意攻击的方式和手段能够选择的余地很大,最终能够成功渗透执行,重点是是由于攻击者的组织中他们自身的知识广泛程度和技术能力的高低,以及自身能否坚持的特性2。报告阶段过程执行过程的结果是向用户上交过程报告,获取用户的认同并成功拿到剩余款项。这份报告凝聚了之前所有阶段中渗透测试团队所获取的关键情报信息、探测是挖掘出的系统安全漏洞、成功渗透攻击的过程,以及造成业务影响后果的攻击途径,同时还要站在防御者的角度上,帮助他们分析安全防御体系的薄弱环节、存在的问题,以及修补与升级技术方案2。22安全漏洞概述221安全漏洞生命周期在渗透测试的执行过程中,重点步骤是通过扫描等方式,侦查出测试主机中的实际的漏洞问题,再进行攻击测试,从而攻破目标主机的防护,渗透到目标主机的过程。其中安全漏洞是必须要存在的,也是所有渗透测试的根据10。通过渗透安全漏洞从而破坏目标主机的效果的过程,破坏的程序叫做渗透程序,安全漏洞的生命周期10,如图21所示安全漏洞研究与挖掘EXPLOIT代码的测试与开发安全漏洞EXPLOIT代码限于封闭团队安全漏洞EXPLOIT代码开始扩散攻击工具恶意程序出现并传播EXPLOIT攻击工具恶意程序大规模传播并危害互联网EXPLOIT攻击工具恶意程序逐渐消亡安全漏洞发现EXPLOIT代码出现安全漏洞揭露公布PTACH发布PATCH修补检测移除的广泛应用0DAY1DAY图21安全漏洞生命周期222安全漏洞披露方式安全公开披露的分类,如表24所示表24PTES渗透测试过程环节完全公开披露漏洞被发现后,测试者向使用者公布全部的漏洞出现的实际问题,以及触发条件,软件开发厂商很难做到在黑客对漏洞进行开发利用之前,发布安全补丁,像这样不负责任的披露,以至于他们的软件使用着,由于漏洞披露而被攻击与利用9。负责任的公开披露在发现漏洞以后,先对软件厂商沟通与交流,给他们一段时间,去进行漏洞补丁测试与开发,之后,软件厂商发布“安全补丁”,如果软件厂商拖延补丁发布的日期,那么就完全公开漏洞分析与利用的技术细节2。进入地下经济链安全研究出的漏洞有着巨大大的经济价值,那么,有些黑客不认同去免费地为软件开发厂商查找漏洞,这样,软件漏洞交易市场应运而生4。小范围利用直至被动披露软件的披露方式是多种的,渗透测试者发现的“安全漏洞”也会有很多并没有完全通知软件开发厂商,而是被他们在“小范围”的群体里去利用,不过,影响范围会不断扩大,最后被“恶意代码”所利用,危害大多数的使用者4。223安全漏洞公共资源库国内外的安全漏洞信息库主要包括内容,如表25所示表25国内外的安全漏洞信息库CNNVD中国国家漏洞库。CNVD中国国家信息安全漏洞共享平台,由国家计算机网络应急技术处理协调中心维护2。乌云安全漏洞报告平台民间组织。SCAP中文社区由诸葛建伟等人发起的民间组织。CVE“通用漏洞披露”,由美国国土安全部资助的MITRE公司进行维护工作,已成为安全漏洞命名索引业界的实施标准,“CVE漏洞库”为每个确认的公开披露的漏洞建立CVE编号,以及一段简单的漏洞信息描述2。NVD“国家漏洞数据库”,是美国政府官方根据NIST的SCAP标准协议所描述的安全漏洞信息库,具体由美国国土安全部下属的NCSD国家安全部门USCERT组进行维护2。23本章小结本章主要从渗透测试和安全漏洞两个方面进行描述,第一方面是渗透测试,渗透测试中主要简述了起源、概念与分类、体系与标准以及PTES渗透测试标准的介绍,大体上对渗透测试进行了简要的介绍,为后面使用METASPLOIT渗透测试工具进行漏洞利用做了前序的基础讲解。第二方面,主要是安全漏洞。从安全漏洞的生命周期、披漏方式、以及公共资源库三个方面进行了简要的概述,将现在目前主流的一些安全漏洞的组织进行总结,以便于读者能够查阅相关信息与资料。第三章软件漏洞栈溢出原理分析31二进制文件概述311PE文件格式PE文件是WIN32平台下可执行文件遵守的数据格式,一般的可执行文件(“EXE”文件和“DLL”文件)都是典型的PE文件8。一个可执行的文件不仅包含了二进制机器代码,还会自带许多其他信息,如字体、菜单、字符串、位图、图标等1。PE文件格式规定了这些信息在可执行文件中是如何组织,在程序被执行时,操作系统会按照PE文件格式的约定去相应的地方准确的定位各种类型的资源,并分别装入内存的不同区域,如果没有这种通用的文件格式进行约定内存的装入会变得异常困难1。PE文件的重要节组成部分,如表31所示表31PE文件节的重要组成部分TEXT由编译器产生,存放着二进制的机器代码,也是主要反汇编和调试对象1。DATA初始化数据块。IDATA可执行文件所使用的动态链接库,与外来函数与文件信息1。RSRC存放程序的资源。程序员对PE文件的理解,即PE文件是由很多的不同的数据部分组成的,也就是一些按照不同的组织进行分配的集合,PE文件结构,如图31所示DOSMZ头DOSSTUBPE头节表节内容DOS头PE头PE数据区PE文件头部图3132位的PE结构划分程序员对PE文件的理解,即PE文件是由很多的不同的数据部分组成的,也就是一些按照不同的组织进行分配的集合,程序员眼中的PE结构,如图32所示IMAGE_DOS_HEASER64DOSSTUB大小不确定,但以某大小对齐)SIGNATURE4IMAGE_FILE_HEADER2088IMAGE_DATA_DIRECTORY168IMAGE_OPTIONAL_HEADER32216IMAGE_NT_HEADERS240IMAGE_SECTION_HEADERN40节内容大小不确定,但以某大小对齐)DOSMZ头头DOSSTUBPE头标识头标准PE头扩展PE头数据目录项PE头节表DOS头PE头节表节内容PE文件头部PE文件身体图32程序员眼中的PE结构312虚拟内存系统的内存存放方式由两个方面组成虚拟内存以及物理内存。其中,物理内存更加复杂,系统需要进入到WINDOWS内核级别要达到的RING0才能查看。一般,在普通的用户使用软件的模式环境下,我们用工具看到的地址其实都是虚拟内存地址1。如果我们实际内存条只有512MB,而想要让系统的全部进程都相信每一个进程占有独立4GB的内存空间。其过程如图33所示进程1进程2进程3属于进程1的虚拟内存(4GB)属于进程2的虚拟内存(4GB)属于进程3的虚拟内存(4GB)虚拟内存管理器真正的物理内存512MB图33WINDOWS虚拟内存与物理内存示意图313PE文件与虚拟内存之间的映射虚拟内存地址和PE文件地址之间的映射关系中要用到的重要概念。如表32所示表32映射关系的重要概念文件偏移地址(FILEOFFSET)数据在PE文件的地址,当数据存在文件磁盘上时,其相对于文件开头偏移部分的位置1。装载基址(IMAGEBASE)PE文件装入内存中的基地址,不单独说明时,0X00400000是EXE文件的初始地址,00X10000000是DLL文件的初始地址1。虚拟内存地址VIRTUALADDRESSPE文件的指令被装入内存后的地址1。相对虚拟地址(RELATIVEVIRTUALADDRESS)内存地址相对于映射基址的偏移量1。相对虚拟地址、映射基址、相对虚拟内存地址这三者之间有这样的关系RVABASEIMGVA在普遍状态下,0X00400000位置是其装载之后的0字节的位置地址,即装载基址1。如图34所示DATA节IDATA节TEXT节文件头节表等DATA节RDATA节TEXT节其他文件头节表等PE文件起始0字节0X200字节0X200字节0X200字节装载基址(IMAGEBASE)0X004000000X1000字节0X1000字节0X1000字节PE文件内存图34PE文件与虚拟内存的映射关系相对于文件初始地址0字节的偏移是文件偏移,而相对于装载基址0X00400000处的偏移则是RVA(相对虚拟地址),操作系统在进行装载时,各种数据结构需要保持与PE结构“大致相同”,所以,RVA和文件偏移地址很大程度上有相似性1。“大致的相同”是由于有一些细微的区别,由于内存数据的存放单位与文件数据的存放单位的不一致的差别1。1标准存放方式的基本单位是0X200,基础是PE文件中的磁盘数据,不足0X200数据时,由0X00继续填充,其总数量超过0X200时,会占用接下来的0X200块,所以,数据节全都是0X200的倍数1。2内存中装入代码,存放方式是以内存数据作为标准来存放的,组织基本单位是0X1000。同样,剩余的部分会被填充,一个节中存不下的部分,就会被分配给出接下来的位置1。由此,虚拟内存对应至文件偏移之间两者的转换关系的公式文件偏移地址虚拟内存地址(VA)装载地址(IMAGEBASE)节偏移1RVA节偏移RVA和文件偏移地址两者的映射关系,如表33所示表33文件偏移位置和RVA之间的映射关系节(SECTION)文件偏移量相对虚拟偏移量RVATEXT0X04000X00001000RDATA0X62000X00007000DATA0X74000X00000900RSRC0X78000X0002D000利用表中的数据,如果在调试时遇到虚拟内存中0X00404144处的一条指令,那么这条指令在文件中的偏移量,利用上述公式带入文件偏离量0X004041440X04000000X10000X400)0X354432系统栈的工作原理321进程的内存1进程内存的四个部分进程内存的四个功能部分,如表34所示表34进程内存的功能组成部分代码区CPU取指并执行的位置,被装入的“二进制代码”区1。数据区用于存储全局变量等。堆区动态的回收和分配的部分,系统自由地分配出适当的内存空间,避免浪费,在程序执行完成之后,回收空间1。栈区动态地存放不同函数相互之间调用关系。2进程的内存调用方式十六进制的双字节的代码段会在PE文件被装载时,被填充进PE文件的(TEXT)代码区,CPU会执行这一部分的指令并调入数据,在此之后,打包送进ALU中进行重新的运算;若取出的指令要求是动态开辟的,那么系统会开辟一部分适当的堆区空间去装载新的代码;当函数被调用的过程中,内存的栈区会动态地保存函数的调用关系,方便CPU能够在执行完被调用的代码后,能够正常的进行下一部分的函数调用1。这个过程,如图35所示装载运行PE文件进程的虚拟内存空间EIPXOREBX,EBXMOVBH,4SUBESP,EBXMOVBX,233PUSHEBXPUSH72657375PUSHESPXOPEDX,EDX当前函数的栈帧函数栈帧函数栈帧函数栈帧函数栈帧ESPEBP数据区(全局变量)堆图35进程的内存使用示意图322栈和系统栈栈是一种先进后出的数据表,是一种特殊的数据存储方式,其中常见的操作压栈(PUSH)和弹栈(POP);用于标示栈的属性也有两种栈顶(TOP)、栈底(BASE)1。详细解释,如表35所示表35栈的基本操作与标示PUSH为栈增加一个数据。POP从栈中取出一个元素,必须要从最上面取出。TOP动态变化地标示栈顶位置,PUSH增1,POP减1。BASE不会改变,一直要标示栈底位置,防止栈空之后,继续弹栈的操作13。323函数的调用过程1函数对应的机器指令在代码区中分布过程,如图36所示其他指令FUN_B的指令(MAIN的函数指令)其他指令FUN_A的指令图36函数代码在代码区的分布示意图2CPU在执行取指调用的过程处理器在调用FUN_A函数时,会MAIN函数对应的机器指令的区域,跳转到FUN_A代码中对应代码部分,从那段代码中取指执行;当FUN_A代码取指之后,执行CALLFUN_B指令,并跳转至FUN_B代码,返回时,先跳转到FUN_A地址,逐步跳转到MAIN函数的后续代码部分,接着取指1。CPU的取指轨迹,如图37所示MAIN函数入口CALLFUN_A后续的指令返回指令FUN_B函数入口返回指令FUN_A函数入口CALLFUN_B后续的指令返回指令返回到上层函数的代码空间紧接着执行函数调用的后续指令跳转去FUN_B代码空间取指执行处理器跳转去FUN_A的代码空间去继续执行返回FUN_A函数继续执行图37CPU的取指轨迹示意图3系统栈在执行函数调用时的过程在函数调用中,系统栈的操作过程第一步在MAIN函数调用FUN_A的时候,一开始在自身的栈中,PUSH返回地址,然后FUN_A函数再创建新栈并PUSH系统栈。第二步在FUN_A调用FUN_B的时候,也是将自身的栈PUSH函数返回地址,然后为FUN_B函数创建新栈帧,最后PUSH系统栈。第三步FUN_B返回,FUN_B函数栈帧被POP系统栈,栈顶露出FUN_A函数栈帧的返回地址,处理器继续按照该返回地址,重新跳到FUN_A代码区进行执行1。第四步在函数FUN_A返回时,FUN_A的栈空间被释放,栈顶露出MAIN部分的返回地址,处理器将跳到MAIN函数代码区接着执行1。详细解释,如图38所示MAIN函数栈帧其它函数栈帧MAIN函数栈帧局部变量其它函数栈帧返回地址其它函数栈帧MAIN函数栈帧返回地址FUN_A栈帧返回地址局部变量FUN_A栈帧局部变量FUN_B栈帧其它函数栈帧MAIN函数栈帧返回地址局部变量FUN_A栈帧其它函数栈帧MAIN函数栈帧用弹出的返回地址回溯出上一个函数的代码空间用弹出的返回地址回溯出上一个函数的代码空间栈顶方向(TOP)栈底方向(BASE)代码空间程序被装入,由MAIN函数代码空间依次取指执行系统栈空间系统栈栈顶为当前正在执行的MAIN函数栈帧代码空间执行到MAIN代码区的CALL指令时,跳转到FUN_A的代码区继续执行系统栈空间为配合FUN_A的执行,在系统栈中为其开辟新的栈帧并压入代码空间执行到FUN_A代码区的CALL指令时,跳转到FUN_B的代码区继续执行系统栈空间为配合FUN_B的执行,在系统中为其开辟新的栈帧并压入代码空间FUN_B代码执行完毕,弹出自己的栈帧,并从中或的返回地址,跳回FUN_A代码区继续执行系统栈空间弹出FUN_B的栈帧,对应于当前正在执行的函数,当前栈顶栈帧恢复成FUN_A函数栈帧代码空间FUN_A代码执行完毕,弹出自己的栈帧,并从中或的返回地址,跳回MAIN代码区继续执行系统栈空间弹出FUN_A的栈帧,对应于当前正在执行的函数,当前栈顶栈帧恢复成MAIN函数栈帧图38系统栈在函数调用时的变化324寄存器与函数栈帧1寄存器每一个运行的函数占据各自专属的一段内存中的堆栈空间,栈顶是目前一直执行任务的函数的栈帧的顶部指针,特别的栈帧是系统用来特别标注的函数特殊位置的标志1。基本的重要的几个指针,如表36所示表36特殊的指针寄存器ESP(EXTENDEDSTACKPOINTER)栈指针寄存器,存储一个一直指向系统栈,帧栈顶部的指针1。EBP(EXTENDEDBASEPOINTER)基址指针寄存器,存储一个一直指向系统栈最上面的一个栈帧底部的指针1。EIP(EXTENDEDINSTRUCTIONPOINTER)指令寄存器,存储一个一直指向待执行的指令地址的指针1。寄存器对栈帧的标示作用,如图39所示栈顶以上的未使用的内存空间栈帧1栈帧2栈帧3栈帧栈帧2栈帧3栈帧栈帧1被释放栈顶以上的未使用的内存空间栈帧3栈帧栈帧2被释放栈顶以上的未使用的内存空间EBPEBPESPEBPEBPESP图39栈帧寄存器ESP与EBP的作用2函数栈帧不同的函数需要开辟自己单独的一段空间,EBP是目前执行函数调用的堆栈的指针,标示其底部,而同一当前函数的顶部由ESP指示,这就是普遍函数栈在调用过程中,比较特别的标志函数的堆栈位置的指针9。在函数栈帧中,包含着的重要内容,如表37所示表37函数栈帧包含内容局部变量装载局部变量的内存空间1。栈帧状态标示保存前栈帧底部和顶部的位置,运算获得函数顶部的状态位置,以便在当前栈帧空间被释放之后,能够正常获得上一个栈帧的位置1。函数返回地址保存当前函数调用前的指令位置,即返回地址,这样在上层函数释放后,函数返回时,回到被调用前的函数代码区中,接着执行后续的指令1。325函数调用约定与相关指令1函数调用每一个调用约定描述了函数传递参数方式和栈协同工作的技术细节1。不同的编译器、不同的语言、不同的操作系统实现函数调用的原理基本相同,可实际的跳转过程还是不一致的,其中包括函数返回时恢复栈平衡时的操作,参数入栈顺序是从右向左还是从左向右,跳转到还是在母函数中,还是接着子函数继续执行,这些不一致导致的结果就是跳转的实际的位置的不同1。调用方式之间的差异,如表38所示表38函数调用方式的差异SYSCALLBASICPASCALSTDCALLCFORTRAN参数入栈顺序右左左右左右右左右左左右恢复平衡操作的位置子函数子函数子函数子函数母函数子函数2函数调用的约定举例看,其中C语言,主要是按照以下函数的调用约定去执行,如表39所示表39函数调用约定调用约定的声明恢复栈平衡的位置参数入栈顺序_CDECL母函数右左_FASTCALL子函数右左_STDCALL子函数右左3函数调用的具体步骤,如表310所示表310函数调用的具体步骤参数入栈参数压入系统栈中。返回地址入栈目前执行的函数的下一条指令PUSH进入,返回指令被执行时,就会调用返回地址去执行后续地址指令9。代码区跳转CPU从目前区域JUMP到被调用的下一条函数的启动执行地址处,继续执行后续的指令的跳转过程。栈帧调整保存当前栈帧状态值,当前栈帧,切换到新栈帧。给新栈帧分配空间。4函数返回的具体步骤,如表311所示表311函数返回的具体步骤保存返回值函数的返回值保存在寄存器EAX中,以便后续的指令去进行调用的过程,利用寄存器来存储返回值是基本的函数返回保存的方式1。弹出函数栈帧,恢复上一栈帧首先保持栈的平衡,然后将ESP抬高,减小EBP的知识位置,将剩余的函数空间释放掉,以便后续的利用。把存储在栈中的前EBP值取出并放入EBP寄存器进行存储,并释放空间,执行至上一栈帧的位置。EIP寄存器继续执行跳转的函数的返回地址,并成功进行了跳转指令,栈帧的恢复过程执行完毕。跳转在最后阶段,能够按照刚才取出的函数返回地址成功得跳回到母函数的地址中继续执行9。5函数调用的实现过程函数调用的过程中,首先按照后面的参数先压入,前面的参数后压入的规律进行入栈操作,接下来压入的是函数的参数返回地址,能够控制程序返回时的跳转位置,接下来是函数的局部变量,这个是按照指令的先后顺序而执行的,将其局部变量入栈之后,继续执行后续的指令。函数的栈帧,就是通过逐层的入栈的顺序来执行的,而后当执行跳转指令时,就会跳转到栈帧里存储的数值地址,这样,就能执行上层函数的指令了。不同的栈帧就是通过这样的一种压栈执行的方式而将其组织形成系统栈帧的过程。这个具体的过程,如图310所示其他数据MAIN栈帧局部变量VAR_B2局部变量VAR_B1前栈帧的EBP返回地址FUN_B的第一个参数FUN_B的第二个参数局部变量VAR_A前栈帧的EBP返回地址FUN_A第一个参数的ARG_A1FUN_A第二个参数的ARG_A2局部变量VAR_MAIN前栈帧的EBP返回地址MAIN第一个参数INTARGCMAIN第二个参数CHARARGVMAIN第三个参数CHARENVPESPEBP(FUN_A代码区)CALLFUN_BMOVVAR_A,EAXMAIN代码区)CALLFUN_AMOVVAR_MAIN,EAXFUN_B栈帧FUN_A栈帧图310函数调用的实现326利用OD查看PE文件装载进入内存的效果在编译器中,在程序被编译以后,函数会自动分解调用INVOKE指令。其中,会有操作数的执行,而当内存调用PE文件的时刻,就会变成导入函数真实的偏移地址,继续执行指令的跳转。用OD打开PE文件显示的效果,如图311所示图311OD打开PE文件的效果其中,内存与地址的映射和PE文件各个组成结构的关系,如图312所示图312内存与地址映射关系326INVOKE指令分解对INVOKE指令分解步骤,如表312所示表312INVOKE指令分解步骤压栈首先要调用所有参数PUSH到栈中,压栈时按照先推后参数,再推前参数的规则,即第一个推入栈的应该是调用的最后一个参数,而最后一个推入栈的参数应该是调用的第一个参数1。段内调用由CALL调用段内地址。无条件转移不考虑任何问题,直接跳转执行CALL以后的地址13。33SHELLCODE的开发331SHELLCODE的概念SHELLCODE其代码能够实现缓冲区溢出的现象,有的是攻击目标主机进入主机系统、上传木马、修改文件数据、运行恶意软件,或者致使目标主机瘫痪或蓝屏等,其中,代码部分需要用汇编语言来编写,并转换成二进制语言,大小和攻击方式受到缓冲区的空间的限制,由此,调试和开发的难度都相当的高1。EXPLOIT代码植入的过程,就是SHELLCODE执行的过程,一般出现形式是代码攻击的形式,用于生成攻击性的网络数据包,或者是其他形式的攻击,覆盖返回地址是重点内容,从而劫持进程的控制权,让程序按照额定的方式去执行,之后跳转,去执行自身编写的SHELLCODE1。EXPLOIT中缓冲区溢出的功能模块,如图313所示瞄准系统、导航系统(返回地址、跳转指令等)目标(有漏洞的主机或程序)弹头有效载荷SHELLCODE导弹(EXPLOIT)图313缓冲区溢出中的功能模块332缓冲区的概述1缓冲区的组成执行跳转指针的指令来作为SHELLCODE的执行方式,就要确定函数返回的完毕,想要灵活分配SHELLCODE,就得根据所需空间以及缓冲区范围空间比较,最后决定放置的位置1。其中,存进缓冲区的数据值,如表313所示表313缓冲区的填充数据填充物一般用NOP指令来填充缓冲区,对应的值是0X90,也能够是不同的普通值,没有特殊限定,最好放在SHELLCODE之后2。这样只要运行到填充区,就算跳转不到攻击代码的确切起点,但CPU取指可以取到SHELLCODE。淹没返回地址的数据可以是攻击代码的起始地址、跳转指令的地址,甚至是一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论