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

2015/5/21 11:07:55

之前我们一直在Linux平台上分析漏洞,那是因为对于绝大多数Hacker获得一个Linux平台更加容易,而且主流的服务器系统基本也都是Linux/Unix的;另外一个好处就是Linux提供了用户自定义的强大功能,我们可以根据需要编译汇编程序代码,关闭相应的安全保护机制,便于我们的研究学习。

然而现实中有影响力的漏洞大多是基于Windows系统,因此这节我们来介绍下Winodws系统上是安全保护机制,至于Windows上的漏洞分析,我们会在之后的恶意代码分析章节继续介绍。

  • 理解SEH
  • Windows系统内存保护
  • Windows系统内存保护机制绕过简介

一、理解SEH

一般来说,触发漏洞会导致程序的崩溃,Windows中引入了SEH(Structured Exception Hadnling),即结构化异常处理机制,这种机制在源代码中一般是通过Try-Exception来实现的,比如像下面:

int main(){    _try {            //可能出现异常崩溃的代码        }    _except(EXCEPTION_EXECUTE_HANDLER) {            //异常处理程序        }    return 0;}

这种SEH结构在运行中主要通过添加一个EXCEPTION_REGISTRATION结构来实现,这个结构有两个成员:

  • prev:用于指向下一个SEH记录的指针;
  • handler:指向实际处理程序代码的指针;

其实Windows在原始的程序栈前面添加了一个异常处理结构,该结构由一系列的异常处理链表组成,这条链表的起始点总是放在TIB(Thread Information Block)的第一个成员中,在x86计算机中存储在FS:[0]寄存器中。链表的最后总是默认处理程序,这个默认处理程序的指针总是0xFFFFFFFF。具体结构如下图:

二、Windows系统内存保护

如果想全面探讨Windows下的安全保护机制,一定需要很大的篇幅,在这里我们仅对重要的做一个介绍,以起到抛砖引玉之用,感兴趣的朋友可以继续查询更多资料。

1. 基于栈的缓冲区溢出检测(GS)

我们首先来介绍基于栈的缓冲区溢出检测(GS)的实现,这个机制的本质思想是在缓冲区溢出导致的覆盖位置设置一个标签值,该值具体位于所保存的EBP和RETN(EIP)地址的上方,当从函数返回时会检查这个标签值,看其是否被修改。由于其位于EBP上方,因此一档该值修改,则可以判定RETN也被修改,即发生了缓冲区溢出攻击。新的函数开场白如下:

push ebpmov ebp, espsub esp, 24h    ;这三步同正常的开场白一致move ax, dword ptr [vuln!_security_cookie]xor eax, ebp    ;xor cookie with ebpmov dword ptr [ebp - 4]

而对应的函数收场白也添加了cookie值的验证:

mov ecx, dword ptr [ebp - 4]xor ecx, ebp    ;if cookie or ebp changedcall vuln!_security_check_cookie(004012e8)leaveret

其实就是将安全cookie同ebp进行异或运算后存放在栈上,然后函数返回的时候取出安全cookie,再次与ebp进行异或测试是否同系统值匹配。一种改进是在这个基础上添加了一份参数副本,从而使得原始函数参数即使被覆盖也没用,具体结构如下:

2. SafeSEH

SafeSEH主要是对SEH结构的保护机制,防止覆盖和使用存储在栈上的SEH结构。在触发异常时SafeSEH会进行以下几项检查:

  • 确保异常记录位于当前线程的栈上;
  • 确保处理程序指针没有回指栈;
  • 确保处理程序已经在授权处理程序列表中登记;
  • 确保处理程序位于可执行的内存映像中;

3. 堆保护

传统的堆漏洞攻击会覆盖对块首部,并视图创建一个伪造的块,当内存释放例程执行时可以使用该块在任意内存地址处写入任意4个字节。具体为:

  • 安全移除:在进行移除前,操作系统会验证向前和向后指针指向的相同的块;
  • 堆元数据cookie:在堆块首部存储一个1字节的cookie,当从空闲列表中移除之前先检查该值。Vista中在几个关键首部字段增加了XOR加密措施,并在使用前进行检查,以防止篡改。

4. DEP

DEP(Data Execution Prevention),即数据执行保护,阻止存放在堆、栈或数据内存中的代码执行,这一直以来都是安全操作系统设计的目标。2004年AMD在其CPU中提供了NX位,首次允许硬件识别内存页是否可执行并采取相应措施。Intel后来推出来了XD功能,实现了类似的功能。

5. ASLR

ASLR(Address Space Layout Randomization),即地址空间随机化,思想时在进程使用的内存地址引入随机性,这样会使得攻击变得更加艰难。一些随机化有:

  • 可执行映像采取255个随机位置之一;
  • DLL映像中,ntdll.dll随机加载到256个随机位置之一,然后其他的DLL文件随机加载到另一个随机位置;
  • 栈:比其他内存区更加随机化;
  • 堆:基本堆结构位于32个随机位置之一;
  • PEB(Process Enviroment Block,进程环境块)/TEB(Thread Enviroment Block,线程环境块)

但是应该注意到,由于Windows系统64KB内存页的限制,因此内存地址随机化时其中一些内存区的熵值较小,即随机化空间不大,因此可以利用蛮力破解。

三、Windows系统内存保护机制绕过简介

安全的攻防总是一种竞赛的态势,交替发展。这部分我们来简要介绍下Windows下的保护绕过机制,重点是GS和ASLR的一些思路,主要在于启发大家的思路,网上有着更加 丰富的资料。

1. 绕开GS保护

直接来介绍几种可能的思路:

  1. 猜测cookie值:由于GS保护机制使用了几个较弱的cookie源,因此攻击者可以对它们进行计算并进行预测\猜测cookie值,这种方式适合应用在本地系统攻击中;
  2. 覆盖调用函数指针:通过调用虚函数时调用方函数会讲对象或结构放在栈上,因此如果能够覆盖虚函数的vtable,然后创建伪造的vtable,那么就可以重定向虚函数并获得代码执行;
  3. 替换cookie:由于cookie的值写在.data区,而这个区是可写的,因此如果有任意内存写入权限,那么就可以覆盖该值;
  4. 覆盖SEH记录:GS机制并没有保护SEH,因此如果能够写入足够的数据覆盖SEH,并在函数收场白检查cookie之前触发异常,将执行流程导向SEH,那么就可以控制程序的执行。

2. 绕开ASLR

绕开ASLR的最简单方式就是返回到那些没有链接ASLR保护机制的模块中,可以使用pvefindaddr工具的noasir选项列出所有没有链接ASLR的模块,比如MSVCR71.dll模块就没有受到ASLR的保护,我们可以返回到该模块。

** Refer: Gray Hat Hacking: The Ethical Hacker‘s Handbook, Third Edition **

时间: 2024-10-05 11:39:27

【安全健行】(6):Windows漏洞保护机制的相关文章

六.Windows内核保护机制--中断门

一.中断门,和调用门差不多,细节方面有些差异: 1.符号表的问题,调用门中所使用的是GDT表,而中断门中使用的是IDT表. 2.中断门,不能直接传参数. 3.TEPY标志不一样,调用门是1100 ,32位中断门是1110 ,16位中断门是0110. 4.调用方式不太一样,调用门使用的是CALL调用,中断门直接使用 int [ index](index使用10进制就行了),对IDT表进行搜索. 5.前面说过了,调用门在使用的时候,会更改 CS SS EIP ESP四个寄存.中断门除了这4个,还增加

九.Windows内核保护机制--TSS

一.什么是TSS: TSS全称Task State Segment,中文名任务状态段,储存在内存中,大小104个字节,结构如下: 二.TSS原本的作用: TSS在任务(进程)切换时起着重要的作用,通过它保存CPU中各寄存器的值,实现任务的挂起和恢复. 比如说,当CPU执行A进程的时间片用完,要切换到B进程时,CPU会先把当前寄存器里的值保存到A进程的TSS里(任务寄存器TR指向当前进程的TSS),比如CS,EIP,ESP,标志寄存器等等,然后挂起A进程.执行B进程.这样,在CPU下次执行A进程的

Windows漏洞利用技术总结

Windows漏洞利用技术总结 1. 前言 本文是我对漏洞利用技术的学习总结,也是自己践行QAD (Questions.Answer.Discussions)的一次实践.本文通过阅读几位大牛的文章.演讲报告.exploit编写教程等技术文档不断总结修改而成,列举了当前Windows下常见攻击缓解技术的基本原理及绕过方法,具体技术细节则不详细描述,大家可以通过参考文献或其他文章进一步学习.由于本人能力有限,文中可能还存在不少错误,我会不断回顾并完善. 2. Windows攻击缓解技术简介 自从Wi

各种保护机制绕过手法

一.绕过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的方法出现后,这种方法目前已基本不用了,它没有后面

linux程序的常用保护机制

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

windows内存详解(一) 全面介绍Windows内存管理机制及C++内存分配实例

十分感谢MS社区的帖子,讲得很好~ http://social.technet.microsoft.com/Forums/zh-CN/2219/thread/afc1269f-fe08-4dc7-bb94-c395d607e536 (一):进程空间 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本文目的: 对Windows内存管理机制了解清楚,有效的利用C+

GCC中的堆栈保护机制

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

Linux中的保护机制

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

异常的保护机制

以栈作为基础的SEH本身具有很大的危险性,我们可以利用各种手段对栈上SEH节点进行覆盖重写,再次执行异常处理操作时就会将执行权给到了我们用来覆盖的函数上,这实际上在以前是很常见的windows栈溢出手段,当然,除了这种方法外还有许许多多的利用手段,可见这样的异常处理机制还是不够完善的.为了解决这些问题,微软逐步加入了Safe SEH.SEHOP.VCH等来弥补. Safe SEH SafeSEH又叫做软件DEP,是一种在软件层面实现的对SEH的保护机制,它需要操作系统和编译器的双重支持,在vs2