Exploit 编写系列教程第十篇用ROP束缚DEP-酷比魔方

Exploit 编写系列教程第十篇用ROP束缚DEP-酷比魔方


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信