2024年3月29日发(作者:诺基亚1508参数)
Exploit
编写系列教程第十篇:用
ROP
束缚
DEP-
酷比魔方
译:看雪论坛
-dragonltx-2010-9-20
介绍
在我完成我前面的exploit相关教程之后三个月,我最终找了些时间和精力来开始写一篇新
的文章。
在前面的教程中,我已经解释了基于栈溢出的基础和怎样执行任意的代码。我讨论了direct
ret溢出,基于SEH的exploit,Unicode和其他的字符限制条件,运用调试器插件来加速exploit
的开发,怎样绕过常用的内存保护机制和怎样写你自己的shellcode。
然而第一个教程是写来引导人们学习exploit开发的基础,从乱写开始(主要是为了照顾那
些不懂exploit开发的人们),你很可能发现最近的教程大体上继续在这些基础上下功夫,并
且需要牢固的asm知识,创造力的思想,和一些exploit写作的经验。
今天的教材是不一样的。我将继续在我们已经在前面的教程中见过和学到的知识上更上一
步。这需要一些一些要求:
1、你需要掌握基于栈溢出的利用技术(directRET,SEH,等等)。我假设你已经具备了。
2、你需要一些asm知识。不要担心。即使你的知识只是能够明白特定指令的作用,你也将
可能读懂这篇教程。但是当你想自己打造自己的ropexploit/应用rop技术,当你需要完成一
个特定的任务时,你需要能够写asm/认出asm指令。总之,在某种程度上,你能够在写rop
链和写通用的shellcode之间进行比较,因此我猜你已经有了一定水准的asm编写水平。
3、你需要知道怎样用ImmunityDebugger。设置断点,单步执行,修改寄存器和栈上的值。
4、你需要知道栈是如何工作的,数据是怎样入栈的,出栈的,寄存器是怎样工作的并且怎
样使寄存器和栈之间互相影响。这是开始写ROP所必须的。
5、如果你没有掌握基于栈溢出利用的基础,那么这文章不适合你。我将试着解释并且尽可
能好的写出所有的步骤,但是为了避免以一篇很长的文章结束,我将会假设你知道基于栈溢
出的原理和利用方法。
在这系列的文章6中
:8800//2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-
cookies-safeseh-hw-dep-and-aslr/,我已经解释了一些技术来绕过内存保护系统。今天,我将
精心阐述这些保护机制中的一个,叫做DEP。(更确切地说,我将讨论硬件DEP(NX/XD)
和怎样绕过它)。在教程6中你可以读到,有2中主要的保护机制...首先,开发者能够利用
很多技术(安全编码,栈cookies,safeseh,等等)。大多数的编译器和链接器现在默认使用
这些特征(除了“安全编码”,这不是课程的一个特征),这是很不错的。很悲哀,还有相当
多数量的应用程序没有利用保护措施,依靠其他的保护机制。我想你会同意还有很多的开发
者没有将安全编码应用到他们的所有代码中。更重要的是(是事情更糟),一些开发者开始
依靠OS的保护机制(看下面),并且不关心安全编码。
这将我们带到保护的第二层,所有最近版本的Windows操作系统的一部分:ASLR(地址空
间布局随机化)和DEP(数据执行保护)。
ASLR将使栈,堆,模块基地址随机化,使它很难被“预测”(甚至硬编码)地址/内存位置,
因此,使黑客很难打造可靠的exploit。DEP(在这个教程里我指硬件DEP)将会基本上阻
止代码在栈上执行(这是所有前面教程所做的)。
ASLR和DEP的结合已经证明了在大多数情况下是有效的(但是,今天你将会学到的,在
特定环境下还是可以被绕过的)。
简言之,应用程序bug/缓冲区溢出不会自动魔幻地消失,将会不可能消失,并且编译器/链
接器不是一直对所有的模块都适用。这意味着ASLR和DEP是我们最后的防御层。ASLR
和DEP是所有最近OS的一部分,因此,很自然地可以看到攻击/绕过这两种保护机制已经
成为黑客和研究者的重要目标。
在教程里用来绕过DEP的技术不是最新的技术。它基于ret-to-libc的思想并且被烙上“ROP”
的印记,是“ReturnOrientedProgramming”的简称。
我已经在教程6中讨论了ret-to-libc的思想,实际上,在教程6中解释的
NtSetInformationProcess技术是ROP的一个例子。
在过去的几年/几月,用ROP绕过DEP的新技术已经写出来了。这个教程做的就是简单地
将所有的信息聚集起来并且解释他们是怎样用来在win32系统上绕过EDP的。
在看DEP是什么,怎样绕过它之前,有一件很重要的事要记住::
在所有的前面教程中,我们的shellcode(包括定位代码等等)是放在栈或者堆上,并且试着
用可靠的方法来跳到代码处并执行。
由于硬件DEP的使用,我们不能再栈上执行一条指令。你可以在栈上弹入并且弹出数据,
但是我们不能跳到栈中执行代码。在没有绕过/禁掉DEP时不行。
记住。
Win32
世界中的硬件
DEP
硬件DEP利用了在DEP兼容的CPU的NX(“无执行页保护”,AMD规格)或者XD(“不
能执行”,intel规格)位,并且将特定部分的内存(只能包含数据,比如说默认堆,栈,内
存池)标记为不可执行。
当尝试在一个DEP保护的数据页执行代码时,将会发生访问拒绝
(STATUS_ACCESS_VIOLATION(0xc0000005))。在大部分情况下,这会导致进程结束(没
有处理的异常)。事实上,当一个开发者决定他想允许代码在一个特定的内存页中运行,他
将不得不分配内存然后标记为可执行。
在WindowsXPSP2和WindowsServer2003SP1引入了硬件DEP的支持,并且是这两种版
本之后的所有Windows操作系统的一部分。
DEP作用在每个虚拟内存页面并且会改变PTE(页表入口点)上的一位来标记页面。
发布者:admin,转转请注明出处:http://www.yc00.com/num/1711714910a1944950.html
评论列表(0条)