各种保护机制绕过手法

一.绕过GS编译选项

●原理:通过VC++编译器在函数前后添加额外的处理代码,前部分用于由伪随机数生成的cookie并放入.data节段,当本地变量初始化,就会向栈中插入cookie,它位于局部变量和返回地址之间

●绕过方法:

1.猜测/计算cookie

Reducing the Effective Entropy of GS Cookies:http://www.uninformed.org/?v=7&a=2&t=html

至从覆盖SEH的方法出现后,这种方法目前已基本不用了,它没有后面的方法来得简便

2.覆盖SEH

由于当security_check_cookie()函数检测到cookie被更改后,会检查是否安装了安全处理例程,也就是SEH节点中保存的指针,如果没有,那么由系统的异常处理器接管,因此我们可以通过(pop pop ret)覆盖SEH来达到溢出的目的。但对于受SafeSEH保护的模块,就可能会导致exploit失效,关于它的绕过在后续部分再述

辅助工具:OD插件safeSEH、pattern_create、pattern_offset、msfpescan、memdump

3.覆盖虚表指针

堆栈布局:[局部变量][cookie][入栈寄存器][返回地址][参数][虚表指针]

当把虚表指针覆盖后,由于要执行虚函数得通过虚表指针来搜索,即可借此劫持eip

4.利用未被保护的内存突破

5.替换.data中的Cookie突破GS

二.SafeSEH

●原理:

为了防止SEH节点被攻击者恶意利用,微软在.net编译器中加入/sdeseh编译选项引入SafeSEH技术。编译器在编译时将PE文件所有合法的异常处理例程的地址解析出来制成一张表,放在PE文件的数据块(LQAJ)一C0N—FIG)中,并使用shareuser内存中的一个随机数加密,用于匹配检查。

如果该PE文件不支持safesEH,则表的地址为0。当PE文件被系统加载后,表中的内容被加密保存到ntdl1.dll模块的某个数据区。在PE文件行期间,如果发生异常需要调用异常处理例程,系统会逐个检查该例程在表中是否有记录:如果没有则说明该例程非法,进而不执行该异常例程

●绕过方法:

1.利用没有启动SafeSEH保护的模块(比如漏洞软件本身自带的dll文件,可以借助OD插件SafeSEH来查看进程中各模块是否开启SafeSEH保护)

2.攻击没有开启GS的函数

3.覆盖虚表指针

4.利用堆绕过

5.利用某些ActiveX控件绕过

三.DEP绕过(数据执行保护)

●绕过方式:

1.某些程序没有启动DEP保护

2.Ret2Libc(最后可以执行ZwSetInfomationProcess,VirtualProtect,VitualAlloc)(ROP)

3.某些可以执行的内存(比如,Java Applet中动态申请中动态申请的内存空间具有可执行属性)

4.利用某些.Net控件和Java控件来绕过

5.利用TEB突破DEP(局限于XP SP2以下的版本)

6.利用WPN与ROP技术

ROP(Return Oriented Programming):连续调用程序代码本身的内存地址,以逐步地创建一连串欲执行的指令序列.WPM(Write Process Memory):利用微软在kernel32.dll中定义的函数比如:WriteProcess Memory函数可将数据写入到指定进程的内存中。但整个内存区域必须是可访问的,否则将操作失败

7.利用SEH绕过DEP

启用DEP后,就不能使用pop pop ret地址了,而应采用pop reg/pop reg/pop esp/ret 指令的地址,指令 pop esp 可以改变堆栈指针,ret将执行流转移到nseh 中的地址上(用关闭NX 例程的地址覆盖nseh,用指向pop/pop /pop esp/ret 指令的指针覆盖异常处理器)

四.ASLR绕过(地址随机化)

●绕过方式:

1.基地址泄露漏洞,某个dll模块的某个内存地址的泄露,进而可以泄露该DLL的基地址,进而可以得到任意DLL的基地址

2.某些没有开启地址随机化的模块

当浏览器加载一个带try location.href = ‘ms-help://’ 语句的页面时,HXDS.DLL就会被加载,而该DLL并没有开启地址随机化

利用该方法的CVE-2013-3893, CVE2013-1347, CVE-2012-4969, CVE-2012-4792

3.堆喷射需要配合没有开启地址随机化的模块

4.覆盖部分返回地址

虽然模块加载基地址发生变化,但是各模块的入口点地址的低字节不变,只有高位变化

对于地址0×12345678,其中5678部分是固定的,如果存在缓冲区溢出,可以通过memcpy对后两个字节进行覆盖,可以将其设置为0×12340000 ~ 0x1234FFFF中的任意一个值。

如果通过strcpy进行覆盖,因为strcpy会复制末尾的结束符0×00,那么可以将0×12345678覆盖为0×12345600,或者0×12340001 ~ 0x123400FF。

部分返回地址覆盖,可以使得覆盖后的地址相对于基地址的距离是固定的,可以从基地址附近找可以利用的跳转指令。

这种方法的通用性不是很强,因为覆盖返回地址时栈上的Cookie会被破坏。不过具体问题具体分析,为了绕过操作系统的安全保护机制需要考虑各种各样的情况。

5.java Applet Spray:Java Applet中动态申请中动态申请的内存空间具有可执行属性,可在固定地址上分配滑板指令(如Nop和ShellCode),然后挑转到上面地址执行。和常规的HeapSpray不同,Applet申请空间的上限为100MB,而常规的HeapSpray可以达到1GB

6.just in Time Compliation(JIT)即时编译,也就是解释器(如python解释器),主要思想是将ActionScript代码进行大量xor操作,然后编译成字节码,并且多次更新到Flash VM,这样它会建立很多带有恶意xor操作的内存块vary=(0×11223344^0×44332211^0×4433221);

正常情况下被解释器解释为:

如果非常规的跳转到中间某一个字节开始执行代码,结果就是另一番景象了:

关于JIT的详细介绍,可以参考

●Pointer Inference and JIT Spraying以及

●Writing JIT-Spray shellcodefor fun and profit

●Pointer Inference and JIT Spraying

●Writing JIT-Spray shellcode for fun and profit

7.某些固定的基地址

★从Windows NT 4到Windows 8,

(1)SharedUserData的位置一直固定在地址0x7ffe0000上

(2)0x7ffe0300总是指向KiFastSystemCall

(3)反汇编NtUserLockWorkStation函数,发现其就是通过7ffe0300进入内核的

利用方法:

这样,在触发漏洞前合理布局寄存器内容,用函数在系统服务(SSDT / Shadow SSDT)中服务号填充EAX寄存器,然后让EIP跳转到对应的地方去执行,就可以调用指定的函数了。但是也存在很大的局限性:仅仅工作于x86 Windows上;几乎无法调用有参数的函数

★64位Windows系统上0x7ffe0350总是指向函数ntdll!LdrHotPatchRoutine

(经过验证可能不是这个地址,但是这个地址在开启了ASLR后是固定的)

利用方法:

在触发漏洞前合理布局寄存器内容,合理填充HotPatchBuffer 结构体的内容,然后调用LdrHotPatchRoutine。

(1)如果是网页挂马,可以指定从远程地址加载一个DLL文件;

(2)如果已经经过其他方法把DLL打包发送给受害者,执行本地加载DLL即可。

此方法通常需要HeapSpray协助布局内存数据;且需要文件共享服务器存放恶意DLL;只工作于64位系统上的32位应用程序;不适用于Windows 8

五.SEHOP(Structured Exception Handling Overwrite Protection)

●原理:

它可作为SEH的扩展,用于检 测SEH是否被覆写。SEHOP的核心特性是用于检测程序栈中的所有SEH结构链表的完整性,特别是对最后一个SHE结构的检测。在最后一个SEH结构中 拥有一个特殊的异常处理函数指针,指向一个位于ntdll中的函数ntdll!FinalExceptHandler()。当我们用 jmp 06 pop pop ret 来覆盖SEH结构后,由于SEH结构链表的完整性遭到破坏,SEHOP就能检测到异常从而阻止shellcode 的运行

●绕过方式:

1.攻击虚函数

2.攻击未开启SEHOP的模块

3.攻击没有开启GS的函数返回值

4.伪造SEH链表

六.堆保护

●原理:

(1)SafeUnlink:微软改写了操作双向链表的代码,在卸载free list中的堆块时更加小心

(2)Heap cookie:用于检测堆溢出

(3)元数据加密:微软在Vista以及后续版本中使用了该安全措施,块首中的一些重要数据在保存时,会与一个4字节的随机数进行异或,在使用这些数

据的时候需要异或还原,这样就不能直接破坏这些数据了,以达到保护堆的目的

●绕过方式:

(1)攻击堆中的存储变量

(2)利用chunk重设大小攻击堆

(3)利用Lookaside表进行堆溢出

七.某些逻辑漏洞

●绕过方式:

1.Java的jnlp

是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应用程序。

这种逻辑漏洞可以绕过EMET

2.微软的Microsoft Silverlight,类似于java的jnlp,可以绕过上面的保护方式

3.某些VBScript可以绕过EMET(可以远程调用一些文件)

时间: 2024-08-02 13:57:53

各种保护机制绕过手法的相关文章

【安全健行】(6):Windows漏洞保护机制

2015/5/21 11:07:55 之前我们一直在Linux平台上分析漏洞,那是因为对于绝大多数Hacker获得一个Linux平台更加容易,而且主流的服务器系统基本也都是Linux/Unix的:另外一个好处就是Linux提供了用户自定义的强大功能,我们可以根据需要编译汇编程序代码,关闭相应的安全保护机制,便于我们的研究学习. 然而现实中有影响力的漏洞大多是基于Windows系统,因此这节我们来介绍下Winodws系统上是安全保护机制,至于Windows上的漏洞分析,我们会在之后的恶意代码分析章

二进制的保护机制

0x00 checksec 这里主要讲的是CTF中linux下的ELF二进制文件的保护机制.在linux中有一个脚本checksec命令可以查看当前二进制文件的保护机制.任意安装一款gdb插件都会把checksec脚本包含进来. 在gdb中执行: gdb> checksec test Canary : No NX : Yes PIE : No Fortify : No RelRO : Partial 直接在shell中执行: $ checksec test Arch: i386-32-littl

Android中的软件安全和逆向分析[二]—apk反破解技术与安全保护机制

在Android应用开发中,当我们开发完软件之后,我们不希望别人能够反编译破解我们的应用程序,不能修改我们的代码逻辑.实际上,在应用程序的安全机制考虑中,我们希望自己的应用程序安全性高,通过各种加密操作等来增大竞争对手的反编译破解成本.设想,竞争对手开发一个同样的应用程序需要10天,而破解我们的软件程序需要100天,那么势必会打消黑客程序员破解我们应用程序的念头.如何增加对手的破解成本,就需要考验我们应用程序的安全性有多高,加密技术有多强.一个优秀的应用程序,不仅能为用户带来利益,同时也能保护自

GCC中的堆栈保护机制

以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞,由此引发的安全问题比比皆是.我们知道攻击者利用堆栈溢出漏洞时,通常会破坏当前的函数栈.在gcc中,通过编译选项可以添加 函数栈的保护机制,通过重新对局部变量进行布局来实现,达到监测函数栈是否非破坏的目的. gcc中有3个与堆栈保护相关的编译选项 -fstack-protector:启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码. -fstack-protector-all:启用堆栈保护,为所有函数插入保护代码. -fn

CPU保护机制

如果程序可以直接跟内核交互,那么操作系统会变的不稳定.因此有一个机制会讲内核和程序隔开. 一般的CPU有4层保护机制. 第0环,特权级别.只有内核才能运行到第0级别, 最外环,其他程序运行. 所以在内存上也是这样 CPU保护机制

操作系统学习(七) 、保护机制概述

保护机制是可靠运行多任务环境所必须的.它可以用于保护各个任务免受互相之间的干扰.在软件开发的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误.当程序对错误内存空间执行了一次非期望的引用,保护机制可以阻止这种操作并且报告此类事件. 保护机制可以被用于分段和分页机制.处理器寄存器的2个比特位定义了当前执行程序的特权级,称为当前特权级CPL.在分段和分页地址转换过程中,处理器将对CPL进行验证. 通过设置控制寄存器CR0的PE标志(位0)可以让处理器工作在保护模式下,从而也就开启了分段保

Hystrix针对不可用服务的保护机制以及引入缓存

之前我写过一篇博文,通过案例了解Hystrix的各种基本使用方式,在这篇文章里,我们是通过Hystrix调用正常工作的服务,也就是说,Hytrix的保护机制并没有起作用,这里我们将在HystrixProtectDemo.java里演示调用不可用的服务时,hystrix启动保护机制的流程.这个类是基于NormalHystrixDemo.java改写的,只是在其中增加了getFallback方法,代码如下. 1 //省略必要的package和import代码 2 public class Hystr

Linux中的保护机制

Linux中的保护机制 在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了NX.PIE等机制,例如存在NX的话就不能直接执行栈上的数据,存在PIE 的话各个系统调用的地址就是随机化的. 一:canary(栈保护) 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行.

linux程序的常用保护机制

linux程序的常用保护机制 来源 https://www.cnblogs.com/Spider-spiders/p/8798628.html 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP.ASLR等.在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX).ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的. 一.checksec che