您的位置:首页 > 其它

数据执行保护DEP

2013-08-14 23:12 134 查看
由于许多通用的漏洞利用方法和大量的蠕虫! 微软决定在硬件层和软件层加入内存保护。所以从windows XP SP2 (Windows XP Tablet PC Edition 2005) , Windows Server 2003 Service Pack 1 (OS level) 开始、从 visual studio 2003 (编译器方面)开始加入了许多内存保护功能。

我简单的介绍下 数据执行保护Data Execution Prevention (DEP)

DEP是用来弥补计算机对数据和代码混淆这一天然缺陷。DEP的作用是阻止数据页(列如堆页,各种堆栈页以及内存池页)执行代码。根据实现的机制不同分为:软件DEP,硬件DEP。软件DEP页就是微软增加的SafeSeh保护,这种机制与CPU硬件无关,safeseh保护就不在本文作介绍了。硬件DEP保护,需要CPU支持,DEP的工作状态可以分为四种。

 

1- OptIn : DEP只对所有的系统服务和必须的程序有效。(必须的程序:VS中编译时启用了/NXCOMPACT选项的程序)多用于普通用户板的操作系统,windows
xp, windows Vista, windows7(32位)

2- OptOut: DEP对所在系统服务和第三方程序有效,但是你可以从控制面板中设置某些程序为例外。多用于服务器版操作系统windows2003, window2008

3- AlwaysOn : 完全启用DEP保护,没有例外。工作在64位操作系统

4- AlwaysOff :所有进程禁用DEP

在xp系统中 通过编辑boot.ini文件的noexecute段来设置DEP。

怎样攻击DEP?

DEP针对溢出攻击的本源,完善了内存管理机制。同过将内存特设置成不可执行,来阻止堆栈中shellcode的执行。但DEP也有自身的局限性

由于兼容性的原因windows不能对所有进程开启DEP保护(除64操作系统),否则可能会出现异常。当DEP工作在OptIn和OptOut,利用API可以动态关闭DEP,这些API函数的调用没有任何限制,所有的进程都可以调用这些API函数,这也为我们突破DEP铺上大道。

DEP的介绍到此,下面是正面挑战DEP

开启DEP保护是将数据页设置成不可执行,那我们将存放shellcode的内存页修改成可执行状态,或者直接关闭DEP保护不是就OK了,没错正面击败DEP常用的就是使用的这个思想。

(1)通过跳转到ZwSetInformationProcess函数将DEP关闭后再转入shellcode执行。

(2)通过跳转到VirtualProtect函数将存放shellcode所在内存页设置为可以执行,然后在跳到shellcode执行

(3)通过调转到VritualAlloc函数申请一片可执行区域,然后将shellcode拷贝进去,然后去执行shellcode

本文我将主要介绍用第三种方法攻击DEP,因为在做这个实验时遇到了不少的问题,我觉得这个方法也比前两种复杂些,希望大家在看过我的这篇文章后,若有什么好的方法可以一起交流。

实验环境:

操作系统 windowssp3  (在不同平台上shellcode的构造会有差异的)

DEP状态:Optout (为直管绕过DEP,本次试验不开启GS,SafeSeh)

编译器: vc+6.0

build版本 dubeg

使用工具: Ollydbg.exe,OllyFindAddr插件,windbg

首先看

LPVOID VirtualAlloc(  LPVOID lpAddress,   DWORD dwSize,   DWORD flAllocationType,   DWORD flProtect );
lpAddress:申请内存缓冲区起始地址;(传入0x00300000)
dwSize: 申请内存大小 (本实验申请0xFF(256)空间, 这个值注就是因为这里困扰我好久)
flAllocationType: 申请空间类型 (0x00001000)
flProtect:  申请空间的内存访问类型,(0x00000040  可读可写可执行)

由于参数含有0x00使用strcpy系列函数会造成shellcode截断,所以本实验使用memcpy函数来引发异常。
使用windbg的u 函数名, 反汇编VritualAlloc memcpy函数(为了后面参数准备)。

VirtualAlloc函数最终会去调用VritualAllocEx函数。VritualAllocEx函数多增加了一个参数hProcess,由于是本进程自身,所以传入0xFFFFFFFF 
7C809AE1 >  8BFF            MOV EDI,EDI
7C809AE3    55              PUSH EBP
7C809AE4    8BEC            MOV EBP,ESP
7C809AE6    FF75 14         PUSH DWORD PTR SS:[EBP+14]  
7C809AE9    FF75 10         PUSH DWORD PTR SS:[EBP+10]
7C809AEC    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
7C809AEF    FF75 08         PUSH DWORD PTR SS:[EBP+8]
7C809AF2    6A FF           PUSH -1
7C809AF4    E8 09000000     CALL kernel32.VirtualAllocEx   函数地址
7C809AF9    5D              POP EBP
7C809AFA    C2 1000         RETN 10   VritualAlloc函数返回是带有16个字节偏移

memcpy函数
ntdll!memcpy:
7c921db3 55              push    ebp
7c921db4 8bec            mov     ebp,esp
7c921db6 57              push    edi
7c921db7 56              push    esi
7c921db8 8b750c          mov     esi,dword ptr [ebp+0Ch]   目的地址(开辟的可执行空间首地址)
7c921dbb 8b4d10          mov     ecx,dword ptr [ebp+10h]   复制长度
7c921dbe 8b7d08          mov     edi,dword ptr [ebp+8]     源地址存放shellcode
7c921dc1 8bc1 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: