0x01 /GS --缓冲区安全性检查
如果使用/GS进行编译,将在程序中插入代码,以检测可能覆盖函数返回地址的缓冲区溢出。如果发生了缓冲区溢出,系统将向用户显示一个警告对话框,然后终止程序。这样,攻击者将无法控制应用程序。用户也可以编写自定义的错误处理例程,以代替默认对话框来处理错误。
在返回地址之前将插入一个专门的 cookie(系列字节),以使得任何缓冲区溢出都将更改该cookie。在函数返回之前,将测试cookie的值。如果cookie值已被更改,将会调用处理程序。服务器或服务可能会要求进行不同的处理,而不是显示一个对话框。
0x02 SafeSEH
1.什么是SafeSEH?
以前堆栈溢出在的WINDOWS系统中一直都是安全问题的核心,其中覆盖seh的技术早为人熟知。safeseh是一项保护和检测和防止堆栈中的seh被覆盖而导致利用的技术。
2.safeseh是vista的新技术吗?
safeseh并不是vista的新技术,safeseh是xp sp2就已经引入的技术。但是由于safeseh需要.net的编译器编译的image才支持,而xp sp2系统自身所带的库和执行程序都是非.net的编译器编译的,所以使得safeseh在xp sp2上只能成为聋子的耳朵,xp sp2下,堆栈溢出只要覆盖seh的地址就能轻松饶过所有的保护机制。因此在xp sp2时代,关于safeseh的研究从来不被重视,甚至对他的机理研究都存在很多错误,认为safeseh只是屏蔽了数据段的地址,只要是库函数空间地址就是被许可的,一些safeseh的操作被误解读成函数地址保护的操作。
3.为什么vista下SafeSEH才开始发威?
vista自身带的系统库。程序99%以上是用.net的编译器编译的,.net的编译器默认编译时候就会在IMAGE里产生对SafeSEH的支持。因此vista下的应用加载的系统库几乎全是带有SafeSEH支持的IMAGE,堆栈溢出发生时覆盖这些支持safeseh模块的SEH都能被检查出来,使得覆盖堆栈中的SEH地址的技术不再可用。
4.vista下的safeseh的安全性
safeseh是非常强悍的,如果一个进程加载的所有模块都是支持safeseh的image,覆盖seh获得利用就根本不可能。至少VISTA下99%的系统库是支持safeseh的image。而xp sp2 99%的系统库是不支持safeseh的image,因此safeseh虽然是xp sp2就开始使用的技术,但应该算是在vista下才开始发挥作用的技术。 当然如果进程存在一个不支持safeseh的IMAGE就等于整个safeseh的机制失效,不过由于vista下支持进程空间随机技术,可以深层抵御这种情况下的seh覆盖利用。
5.SafeSEH的实现过程
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范围内的代码都可以执行。
//Without SafeSEH void RtlDispatchException(...) { if (exception record is not on the stack) goto corruption; if (handler is on the stack) goto corruption; if (RtlIsValidHandler(handler, process_flags) == FALSE) goto corruption; // execute handler RtlpExecuteHandlerForException(handler, ...) ... } //With SafeSEH BOOL RtlIsValidHandler(handler) { if (handler is in an image) { if (image has the IMAGE_DLLCHARACTERISTICS_NO_SEH flag set) return FALSE; if (image has a SafeSEH table) if (handler found in the table) return TRUE; else return FALSE; if (image is a .NET assembly with the ILonly flag set) return FALSE; // fall through } if (handler is on a non-executable page) { if (ExecuteDispatchEnable bit set in the process flags) return TRUE; } }
0x03 DEP - 数据执行保护
数据执行保护 (DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。在 Microsoft Windows XP Service Pack 2、 Microsoft WindowsServer 2003 Service Pack 1 、Microsoft Windows XP Tablet PC Edition 2005 和 Microsoft Windows Vista 中,由硬件和软件一起强制实施 DEP。
DEP 的主要优点是可以帮助防止数据页执行代码。通常情况下,不从默认堆和堆栈执行代码。硬件实施 DEP 检测从这些位置运行的代码,并在发现执行情况时引发异常。软件实施 DEP 可帮助阻止恶意代码利用 Windows 中的异常处理机制进行破坏。硬件实施 DEP 是某些 DEP 兼容处理器的功能,可以防止在已标记为数据存储区的内存区域中执行代码。 此功能也称为非执行和执行保护。 Windows XP SP2 还包括软件实施 DEP,其目的在于减少利用 Windows 中的例外处理机制的情况。
与防病毒程序不同,硬件和软件实施 DEP 技术的目的并不是防止在计算机上安装有害程序。 而是监视您的已安装程序,帮助确定它们是否正在安全地使用系统内存。 为监视您的程序,硬件实施 DEP 将跟踪已指定为“不可执行”的内存区域。 如果已将内存指定为“不可执行”,但是某个程序试图通过内存执行代码,Windows 将关闭该程序以防止恶意代码。 无论代码是不是恶意,都会执行此操作。
0x04 ASLR
Windows Vista 中包含有一种旨在保护系统免受缓冲区溢出攻击的安全功能:Address Space Layout Randomization(ASLR)的该功能会将关键的系统文件加载到不同的内存地址,提高了恶意代码运行的难度。
我们可以有趣的称这个是微软在和黑客捉迷藏。
0x05 Heap protection& Heap randomization
顾名思义,是堆保护。主要使用了堆Cookie和数据加密,对RtlHeapCreate函数加载地址随机化。