`
pcajax
  • 浏览: 2197588 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Safeseh

阅读更多
么是Safeseh

以前堆栈溢出在的WINDOWS系统中一直都是安全问题的核心,其中覆盖seh的技术早为人熟知。Safeseh是一项保护和检测和防止堆栈中的seh被覆盖而导致利用的技术。

Safeseh是VISTA的新技术吗?

Safeseh并不是VISTA的新技术,Safeseh是xp sp2就已经引入的技术。但是由于Safeseh需要.net的编译器编译的image才支持,而xp sp2系统自身所带的库和执行程序都是非.net的编译器编译的,所以使得Safeseh在xp sp2上只能成为聋子的耳朵,xp sp2下,堆栈溢出只要覆盖seh的地址就能轻松饶过所有的保护机制。因此在xp sp2时代,关于Safeseh的研究从来不被重视,甚至对他的机理研究都存在很多错误,认为Safeseh只是屏蔽了数据段的地址,只要是库函数空间地 址就是被许可的,一些Safeseh的操作被误解读成函数地址保护的操作。

为什么VISTA下Safeseh才开始发威VISTA自身带的系统库。

程序99%以上是用.net的编译器编译的,.net的编译器默认编译时候就会在 IMAGE里产生对Safeseh的支持。因此VISTA下的应用加载的系统库几乎全是带有Safeseh支持的IMAGE,堆栈溢出发生时覆盖这些支持 Safeseh模块的SEH都能被检查出来,使得覆盖堆栈中的SEH地址的技术不再可用。

Safeseh的实现过程

Safeseh本身的原理很简单,就是在编译器生成二进制IMAGE的时候,把所有合法的SEH函数的地址解析出来,在IMAGE里生成一张合法的SEH函数表,用于异常处理时候进行严格的匹配检查。基本过程如下(XP SP2和VISTA一样):

加载过程:加载IMAGE时,定位和读出合法SEH函数表的地址(如果该IMAGE是不支持Safeseh的,则这个SEH函数表的地址为0),使用shareuser内存中的一个随机数加密。

将加密的SEH函数表的加密地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数 作为一条记录放入ntdll的加载模块数据内存中。

异常处理过程:

根据堆栈中SEH的地址,确认是否属于一个IMAGE的地址空间。

如果属于

读取ntdll的加载模块数据内存对应的“SEH函数表的加密地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数"记录 读出shareuser内存中的一个随机数,解密SEH函数表的加密地址,读出真实的SEH函数表地址。

如果该地址不为0,代表该IMAGE支持Safeseh根据合法SEH函数的个数,依次计算合法合法SEH函数的地址并和当前SEH地址进行比较,如果符合执行SEH函数,如果全不符合则不执行当前SEH指定的地址,跳出不执行。

如果该地址为0,代表该IMAGE不支持Safeseh,只要该内存属于该IMAGE.code范围内的代码都可以执行。

如果不属于

检测该地址的内存特征。一般属于内核空间的未加载用户数据地址可以执行(但是其实等效于无法执行的,这块不可能加载用户数据,可能是MS为了迷惑一些研究者吧,看见代码能跳转到如0xcccccccc地址上,以为能饶过Safeseh。)

VISTA下的Safeseh的安全性

Safeseh是非常强悍的,如果一个进程加载的所有模块都是支持Safeseh的 image,覆盖seh获得利用就根本不可能。至少VISTA下99%的系统库是支持Safeseh的image。而xp sp2 99%的系统库是不支持Safeseh的image,因此Safeseh虽然是xp sp2就开始使用的技术,但应该算是在VISTA下才开始发挥作用的技术。当然如果进程存在一个不支持Safeseh的IMAGE就等于整个 Safeseh的机制失效,不过由于VISTA下支持进程空间随机技术,可以深层抵御这种情况下的seh覆盖利用。

当然一个思路是:是否可以通过覆盖shareuser内存中的随机数字和ntdll的SEH函数表的加密地址使得计算出来的SEH函数表的地址为0饶过Safeseh的保护。不过这很困难,因为要达到这个目的除非存在下面的情况:

情况A:知道shareuser内存中加密随机数,并能修改SEH加密地址,则需要知道ntdll加载的地址(随每次启动不同),且能通过漏洞获取shareuser内存中加密随机数,通过计算获得为0的加密地址再写入到SEH加密地址中。

情况B:知道SEH加密地址的数值,并能修改shareuser内存中加密随机数,则需要知道ntdll加载的地址(随每次启动不同),且能通过漏洞获取SEH加密地址的数字,通过计算获得为0的加密KEY,再写入到shareuser内存中。

情况C:需要知道ntdll加载的地址,并能够改写修改SEH加密地址和shareuser内存中加密随机数。以上3种情况都需要特定的复合条件,很难具备。

可能的问题

依然存在着一些可能的问题。

第一就是支持Safeseh需要.net的编译器支持,且程序所有加载的IMAGE都需要支持Safeseh,否则容易导致失效【www.hitidc.com】,但依然有大量的第三方程序和库不是使用.net编译的。

第二就是我使用的.net 2003只对c++的windows应用的默认编译中就支持Safeseh安全特性,在.net的应用编译中,对于运行时生成的托管代码,即使打开安全选 项也不会支持一些安全特性,不知道.net 2005或者MS是否有最新的支持VISTA的.net出来。


分享到:
评论

相关推荐

    从零开始学习软件漏洞挖掘系列教程第五篇:突破SafeSeh防线1

    【软件漏洞挖掘与SafeSEH】 在软件漏洞挖掘领域,了解并掌握如何绕过SafeSEH机制是一项关键技能。SafeSEH,全称为“安全异常处理”,是微软为增强系统安全而引入的一种防御措施,旨在防止攻击者通过覆盖堆栈上的异常...

    OD插件-ollysseh

    This plugin does an in-memory scanning of process loaded modules checking if they were compiled with /SafeSEH, if so it can list the registered handlers (you can follow them at CPU window doing double...

    PESecurity:PowerShell模块,用于检查是否已使用ASLR,DEP,SafeSEH,StrongNaming和Authenticode编译Windows二进制(EXEDLL)

    用于检查Windows二进制文件(EXE / DLL)是否已通过ASLR,DEP,SafeSEH,StrongNaming,Authenticode,Control Flow Guard和HighEntropyVA编译的PowerShell脚本。 Import the module Import-Module .\Get-...

    周玉川-2017221302006-第三次作业1

    【知识点详解】 1. ROP (Return-Oriented ...以上就是关于ROP检测、DEP机制、GS保护、ASLR原理以及SafeSEH安全性的详细介绍,这些知识点都是网络安全领域的重要组成部分,对于理解和防范现代计算机攻击至关重要。

    周玉川-2017221302006-第三次作业2

    以下是关于各种防护机制及其对抗方法的详细解释: 1. **Return-Oriented Programming (ROP)**: ROP 是一种利用内存安全漏洞进行攻击的技术,它通过拼接一系列小的、已存在于内存中的指令(gadgets)来执行任意代码...

    OllySSEH.dll

    《OllySSEH.dll:OD插件与SafeSEH扫描技术详解》 在计算机安全领域,调试器是分析和逆向工程软件的重要工具。OllyDbg(简称OD)是一款广泛使用的x86架构下动态调试器,因其强大的功能和易用性深受黑客、逆向工程师...

    exception.zip

    在本压缩包“exception.zip”中,包含了作者对异常处理机制和safeSEH(Safe Structured Exception Handling)的个人理解和实践案例,这对于学习和研究0day安全技术的人来说是宝贵的资源。 异常处理是编程语言中用于...

    特效代码在线生成 v2.1

    "特效代码在线生成 v2.1"是一款由爱尚互联-ashl.cn开发的ASP源码程序,旨在帮助用户快速生成各种特效代码。这个程序可能还存在一些小问题,需要不断进行更新和完善,以提供更稳定和高效的服务。...

    checksec:用于ASLRDEPSafeSEH检查的windbg扩展

    checksec - Check modules ASLR/DEP/SafeSEH settings 0:001> .load C:\Users\debug\Desktop\checksec\Debug\checksec.dll0:001> !checksecImage Base Size ASLR DEP Safe SEH Module Name 0x00740000 0x00030000...

    C语言精典版本C程序设计语言

    Dave Prosser回答了很多关于ANSI标准的细节问题。我们广泛地使用了Bjarne Stroustrup的C++的翻译程序来部分测试我们的程序。Dave Kristol为我们提供了一个ANSI C编译器进行最终测试。Rich Drechsler帮助我们进行了...

    BH_US_08_Sotirov_Dowd_Bypassing_Memory_Protections.pdf

    这一节包含了所有关于Windows Vista上可用保护机制的必要背景信息,包括它们的行为、任何可能修改其功能性的配置参数以及它们内部工作原理的相关细节。 - **第二部分**:探讨了第一部分中提到的保护机制的局限性,并...

    cve-2010-3333.pdf

    ### 关于CVE-2010-3333的研究:替代性利用向量 #### 研究背景与概述 CVE-2010-3333是一则关于微软Office RTF(Rich Text Format)文件格式中的缓冲区溢出漏洞的信息。此漏洞由团队509与VeriSign iDefense Labs合作...

    Exploit 编写系列教程.pdf

    - SafeSeh:解释如何绕过SafeSEH以继续利用SEH异常。 - HW DEP:讨论如何绕过硬件数据执行保护。 - ASLR:提供绕过地址空间布局随机化的策略。 #### 七、编写Unicode Exploit - **Unicode简介**:Unicode是一种...

    Win10系统VS2022开发环境中X86Win32汇编MASM32环境配置和一些.docx

    1. 防止LNK2026模块对于SAFESEH映像是不安全的错误,需要在属性窗口->连接器->命令行中设置 (/SAFESEH:NO)。 2. 非法访问不应该访问的内存区域,会报处有未经处理的异常错误,例如asm代码中将函数定义在数据区就会报...

    看雪翻译的exploit教程合集

    《exploit教程合集》是看雪社区精心翻译的一系列关于exploit开发和漏洞利用的教程,涵盖了从基础到高级的多个层次。本教程旨在帮助读者深入理解exploit技术,提高安全研究和防护能力。 首先,我们要理解exploit是...

    PESecurity-master

    这些防护机制包括SafeSEH(Structured Exception Handling Overwrite Protection)、Authenticode(微软的一种代码签名技术)、DotNET(微软的.NET框架)相关的安全特性以及ControlFlowGuard(CFG,控制流守卫),...

    代码注入工具.exe

    如果注入的程序带有SafeSEH,那么注入器的SEH不会被触发 本程序用vs2015编译的,在win10 x64和winxp虚拟机测试了没发现问题 如果发现bug之类的,请在下方回帖,有空了会看能否修复 剩下的想到什么在补充吧

    4.2_20210402_210537.docx

    例如,链接中提到了一个关于LNK4075警告的解决方法,这是一个常见的链接器错误,通常出现在Visual Studio中,当编译器选项“/EDITANDCONTINUE”与“/SAFESEH”不兼容时出现。 3. **弹幕设计**:弹幕设计在游戏中指...

    Exploitation

    3. **安全性增强**:通过限制SEH处理程序的修改权限,SafeSEH有效地减少了通过SEH覆盖实现攻击的可能性。 ##### 数据执行保护(Data Execution Prevention, DEP) 数据执行保护(DEP)是一种阻止非执行内存区域...

    初識漏洞開發暨_Windows_緩衝區溢位的攻與防.pdf

    【初识漏洞开发暨Windows缓冲区溢出的攻与防】是关于网络安全中一个核心话题的探讨,主要涉及Web安全、数据安全、安全运营以及安全架构。本篇内容由Peter Chi分享,他是一名IBM CDL软件工程师,拥有丰富的计算机安全...

Global site tag (gtag.js) - Google Analytics