基于Windows的结构化异常处理漏洞利用技术
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 38 卷 第 20 期 Vol.38 No.20
·专栏·
计算机工程 Computer Engineering
文章编号:1000—3428(2012)20—0005—04
文献标识码:A
2012 年 10 月 October 2012
中图分类号:TP309
基于 Windows 的结构化异常处理漏洞利用技术
2 结构化异常处理与保护机制
SEH 是 Windows 提供给程序设计者保障程序健壮性 的强力机制,用来处理程序中出现的错误或异常。如果程 序中使用了_try{}、_except{}或 Assert 宏等处理机制,编 译器将通过向当前函数栈中配置一个 SEH 实现异常处理 或结束。
在应用程序栈中保存了指向当前异常处理代码的指 针。每一个函数或过程都有一个栈帧,如果在该函数或过 程中实现了异常处理,则对应栈帧的异常处理例程信息以
6
计算机工程
2012 年 10 月 20 日
SEH 记录结构储存在栈中。 异常处理例程相互连接构成链表并位于栈底,在线程
的 TEB 中放置着指向 SEH 链的指针,当发生异常时, ntdll.dll 被导入,从 TEB 的 0 字节偏移处开始寻找 SHE 链的头节点,遍历并寻找合适的异常处理例程,如果没有 找到,则使用默认的异常处理例程。SEH 链在栈中的分布 如图 1 所示。
TEB FS:[0]
……
栈顶
2×4个 字节
指向下一个SEH记录 指向当前异常处理例程
异常处理例程1
2×4个 字节
指向下一个SEH记录 指向当前异常处理例程
……
异常处理例程2 ……
0xFFFFFFFF
指向默认异常处理例程
MSVCRT处理例程
栈底
图 1 SEH 链在栈中的分布
从 Windows XP SP1 开始,在调用异常处理例程之 前,所有寄存器都被清空[3],这表示无法利用跳转到寄存 器来执行 Shellcode,从而使攻击代码的编写变得更复杂。
(3)如果程序编译时没有启用 SafeSEH 或至少存在一 个没启用 SafeSEH 的加载模块,则可从中查找一个 pop/ pop/ret 指令组合地址,通过用该地址覆盖 SEH 句柄指针 实现绕过保护。这是基于 SEH 漏洞利用的典型方法。 3.2 理论依据
如果能够覆盖处理异常的 SEH 例程指针,同时有意 触发另一个伪造的异常,则可强制程序跳转到 Shellcode 取得控制权。POP/POP/RET 这一系列指令可以实现上述 功能,系统将认为异常处理例程已被执行从而跳转到下一 个 SEH 或 SEH 链的末尾。
1 概述
结构化异常处理(Structured Exception Handling, SEH) 是 Windows 平台下的异常处理机制之一,同时,也是最 具潜力和价值的漏洞利用技术之一。
微软在.NET 编译器中加入/safeseh 编译选项,引入了 SafeSEH 机制。编译器在编译时将程序中所有合法的异常 处理例程的地址记录在一张表中。当 PE 文件被系统加载 后,表中的内容被加密保存到 ntdll 模块的某个数据区。 调用异常处理例程之前,系统依次检查其地址是否有记 录,如果没有,则不执行该异常例程。
有效攻击代码(Payload)须实现如下功能: (1)触发一个异常。 (2)指向 pop pop ret 指令串的指针覆盖 SE Handler 域, 在异常处理例程之前,指向下一个 SEH 记录的指针地址 被存放到栈的 ESP+8 位置处,pop pop ret 指令串把该地 址存放到 EIP,并允许该地址上的代码被执行。 (3)jumpcode 覆盖 next SEH record 域。 (4)Shellcode 应直接跟在被覆盖的 SE Handler 域后面, 被覆盖的 next SEH record 域中的 jumpcode 将跳到 Shell code。 SEH 漏洞利用技术的执行流程如图 2 所示。
在编写基于 SEH 的 Exploit 之前,须定位 3 个偏移: (1)next SHE 域的偏移,用 jumpcode 覆盖。 (2)SE Handler 域的偏移,用指向 pop pop ret 指令串的 指针覆盖。 (3)放置 Shellcode 的偏移。 通常做法是用唯一模型字符串填充 Payload 来定位上 述 3 个偏移,引发缓冲区溢出,触发异常处理例程以及设 置断点,并察看寄存器 EIP 的值来精确定位 3 个偏移位置。 3.4 SEHOP 的绕过方法及限制 通过覆盖 SEH 结构绕过 SafeSEH 保护的典型利用方 法,其结果使 SEH 链表被拆分,但该方法对有 SEHOP 保 护机制的漏洞利用是不可行的[7]。 在典型的覆盖 SEH 结构方法中,SEH Handler 指向 pop pop ret 指令串,next SEH 中的栈地址被 jmp 06 nop nop 替 换,其中的 2 个 nop nop 字节主要用于填充字符,以构造 一个 DWORD 大小的有效栈地址。如果伪造 SEH 结构中 的该 DWORD 值指向的栈地址,那么就可伪造整个 SEH 链表,并控制下一个 SEH 结构以使此链表有效。 伪造 SEH 链表需考虑以下限制因素: (1)SEH Handler 应指向非 SafeSEH 保护模块。 (2)内存页必须可执行。 (3)SEH 链表不应被篡改,并且位于链表末端的 SEH 结构必须为特定值。 (4)所有的 SEH 结构应为 4-byte 对齐。 (5)最后一个 SEH 结构的 Handler 必须正确指向 ntdll 中的 ntdll!FinalExceptionHandler 例程。 (6)所有 SEH 指针必须指向栈中。 针对所有 SEH 结构必须为 4-byte 对齐,经分析只有 JE 指令匹配,该指令只有当 Z 标志被设置时才跳转,在 Windows 处理异常时,Z 标志是默认关闭的,因此必须通 过执行指令来计算零值,以设置该标志位。XOR 指令是 最佳选择,因此可通过跳转至 XOR POP POP RET 指令串, 以便将 JE 指令解释为 JMP。XOR POP POP RET 指令串 可在返回空值的函数的末端来寻找。 由以上分析得出,可通过以下操作实现绕过 SEHOP 机制: (1)伪造一个有效的 SEH 链表。 (2)将最后一个 SEH 结构中的 Handler 指向 ntdll!Final ExceptHandler 函数。 (3)在栈中放置 Shellcode。 (4)定位内存中的 XOR POP POP RET 指令串地址。
SafeSEH 技术的推出可有效阻止利用 SEH 的 Exploit。 如前所述,如果修改后的异常处理例程无法通过验证,将 不会被调用,从而无法跳转到 Shellcode 去执行利用代码。
SEHOP 保护机制引入后,借助其强大的健壮性, Microsoft 发布了一款补丁,以使所有程序在缺省状态下 启用该安全机制[4]。如果利用 jmp 06 pop pop ret 指令覆盖 SEH 结构,则 SEH 结构链表的完整性遭到破坏,SEHOP 就能检测到异常从而阻止 Shellcode 的运行。
此外,微软在 Windows Vista Service Pack 1 以及 Windows 7 等系 统中 引入 了另 一种 新的 保护 机制 —— SEHOP[1],其核心特性是检测 SEH 结构链表的完整性, 特别是对最后一个 SEH 结构的检测。因为在该结构中拥 有一个特殊的异常处理函数指针,指向位于 ntdll 模块中 的函数 ntdll!FinalExceptHandler,从而实现抵御攻击者利 用 SEH 覆盖技术。
Shellcode[2]是具有特定功能的指令集,缓冲区溢出漏 洞主要采取将 Shellcode 注入被攻击程序来实现。因此, 如何在被攻击程序中嵌入 Shellcode 并使其执行是漏洞利 用技术的关键。
本文从攻击者的角度总结了 SEH 漏洞利用的关键技 术,包括绕过 SafeSEH 和 SEHOP 保护机制的方法,并论 述如何使程序执行流程跳转到利用漏洞的 Shellcode 代码 的常用方法。
图 2 SEH 漏洞利用技术的执行流程
当异常发生时,程序会跳转到 SE Handler 去执行,在 SE Handler 中伪造一个二次异常(pop pop ret 指令串),从
第 38 卷 第 20 期
吴伟民,郭朝伟,黄志伟,等:基于 Windows 的结构化异常处理漏洞利用技术
7
而使流程跳转到 next SEH pointer。next SEH 域位于 SE Handler 域之前,将先被覆盖,Shellcode 位于 SE Handler 之后。用 pop pop ret 指令串覆盖 SE Handler,该指令串将 next SEH 的地址放到 EIP 中,从而使 next SEH 中的指令 得到执行。next SEH 域中的指令跳过 SE Handler 域,最终 使 Shellcode 得到执行。 3.3 偏移定位
Vulnerability Exploitation Technology of Structured Exception Handling Based on Windows
WU Wei-min, GUO Chao-wei, HUANG Zhi-wei, SU Qing, CHEN Qiu-wei (Faculty of Computer, Guangdong University of Technology, Guangzhou 510006, China)
SafeSEH 能有效地保护 SEH 不被利用,但也存在如 下缺陷:
Fra Baidu bibliotek
(1)需要 Microsoft. NET 编译器的支持,对由其他编译 器生成的 PE 文件则无法加入 SafeSEH 保护[6]。
(2)仍有众多 Windows 组件没有加入该技术,进程中 只要有一个组件存在漏洞且没有 SafeSEH 保护,攻击者 仍可通过覆盖 SEH 节点控制程序流程,进而威胁到整个 进程。
只启用 SafeSEH 保护机制是可以被绕过的,经总结 有以下方法:
(1)在 Exploit 中不利用 SEH,而是通过覆盖返回地址 的方法来实施。
(2)利用堆地址覆盖 SEH 结构。在禁用数据执行保护 的进程中,异常分发例程允许 SEH handler 位于某些非映 像页面,意味着可以把 Shellcode 放置在堆中,并通过覆 盖 SEH 跳至堆空间以执行 Shellcode。
【Abstract】This paper discusses the Structured Exception Handling(SEH) and related protection mechanism, from the perspective of attackers, summarizes the technology of SEH vulnerability exploitation. It uses heap addresses or addresses outside of protection modules to overwrite the pointer of SEH handles to bypass SafeSEH, and fakes SEH chain to bypass SEHOP. It analyzes some major methods of making program execution flow locate the Shellcode. Example verifies the effectiveness of the SHE vulnerability exploitation technology. 【Key words】Structured Exception Handling(SEH); SafeSEH mechanism; SEHOP mechanism; vulnerability exploitation technology; Shellcode location DOI: 10.3969/j.issn.1000-3428.2012.20.002
3 SEH 漏洞利用技术
当存在 SafeSEH、SEHOP 保护以及 XOR 机制时,则 不能简单地通过跳转到寄存器来实现利用,而要通过调用 加载模块中的相关指令来达到目的[5]。应首选程序自身模 块中的相关指令地址编写可靠的 Exploit,这样每次使用 的地址几乎是一样的,而不受操作系统版本的影响。但如 果程序本身没有 DLL,那么使用没有 SafeSEH 保护的系 统 DLL,并且该 DLL 有满足需要的指令,也是可行的。 3.1 SafeSEH 的缺陷及绕过方法
———————————— 作者简介:吴伟民(1956-),男,教授,主研方向:信息安全,数据结构,可视计算,虚拟机技术;郭朝伟,硕士研究生;黄志伟,本科生; 苏 庆,讲师;陈秋伟,本科生 收稿日期:2011-12-02 修回日期:2012-02-20 E-mail:sunny8705@126.com
吴伟民,郭朝伟,黄志伟,苏 庆,陈秋伟 (广东工业大学计算机学院,广州 510006)
摘 要:论述基于 Windows 的结构化异常处理(SEH)及相关保护机制,从攻击者的角度总结 SEH 漏洞利用技术。利用堆地址或保护模块之 外的地址覆盖 SEH 句柄指针,绕过 SafeSEH 机制,伪造 SEH 链,绕过 SEHOP 机制,并分析使程序执行流程定位到 Shellcode 的方法。实 例验证了 SEH 漏洞利用技术的有效性。 关键词:结构化异常处理;SafeSEH 机制;SEHOP 机制;漏洞利用技术;Shellcode 定位
·专栏·
计算机工程 Computer Engineering
文章编号:1000—3428(2012)20—0005—04
文献标识码:A
2012 年 10 月 October 2012
中图分类号:TP309
基于 Windows 的结构化异常处理漏洞利用技术
2 结构化异常处理与保护机制
SEH 是 Windows 提供给程序设计者保障程序健壮性 的强力机制,用来处理程序中出现的错误或异常。如果程 序中使用了_try{}、_except{}或 Assert 宏等处理机制,编 译器将通过向当前函数栈中配置一个 SEH 实现异常处理 或结束。
在应用程序栈中保存了指向当前异常处理代码的指 针。每一个函数或过程都有一个栈帧,如果在该函数或过 程中实现了异常处理,则对应栈帧的异常处理例程信息以
6
计算机工程
2012 年 10 月 20 日
SEH 记录结构储存在栈中。 异常处理例程相互连接构成链表并位于栈底,在线程
的 TEB 中放置着指向 SEH 链的指针,当发生异常时, ntdll.dll 被导入,从 TEB 的 0 字节偏移处开始寻找 SHE 链的头节点,遍历并寻找合适的异常处理例程,如果没有 找到,则使用默认的异常处理例程。SEH 链在栈中的分布 如图 1 所示。
TEB FS:[0]
……
栈顶
2×4个 字节
指向下一个SEH记录 指向当前异常处理例程
异常处理例程1
2×4个 字节
指向下一个SEH记录 指向当前异常处理例程
……
异常处理例程2 ……
0xFFFFFFFF
指向默认异常处理例程
MSVCRT处理例程
栈底
图 1 SEH 链在栈中的分布
从 Windows XP SP1 开始,在调用异常处理例程之 前,所有寄存器都被清空[3],这表示无法利用跳转到寄存 器来执行 Shellcode,从而使攻击代码的编写变得更复杂。
(3)如果程序编译时没有启用 SafeSEH 或至少存在一 个没启用 SafeSEH 的加载模块,则可从中查找一个 pop/ pop/ret 指令组合地址,通过用该地址覆盖 SEH 句柄指针 实现绕过保护。这是基于 SEH 漏洞利用的典型方法。 3.2 理论依据
如果能够覆盖处理异常的 SEH 例程指针,同时有意 触发另一个伪造的异常,则可强制程序跳转到 Shellcode 取得控制权。POP/POP/RET 这一系列指令可以实现上述 功能,系统将认为异常处理例程已被执行从而跳转到下一 个 SEH 或 SEH 链的末尾。
1 概述
结构化异常处理(Structured Exception Handling, SEH) 是 Windows 平台下的异常处理机制之一,同时,也是最 具潜力和价值的漏洞利用技术之一。
微软在.NET 编译器中加入/safeseh 编译选项,引入了 SafeSEH 机制。编译器在编译时将程序中所有合法的异常 处理例程的地址记录在一张表中。当 PE 文件被系统加载 后,表中的内容被加密保存到 ntdll 模块的某个数据区。 调用异常处理例程之前,系统依次检查其地址是否有记 录,如果没有,则不执行该异常例程。
有效攻击代码(Payload)须实现如下功能: (1)触发一个异常。 (2)指向 pop pop ret 指令串的指针覆盖 SE Handler 域, 在异常处理例程之前,指向下一个 SEH 记录的指针地址 被存放到栈的 ESP+8 位置处,pop pop ret 指令串把该地 址存放到 EIP,并允许该地址上的代码被执行。 (3)jumpcode 覆盖 next SEH record 域。 (4)Shellcode 应直接跟在被覆盖的 SE Handler 域后面, 被覆盖的 next SEH record 域中的 jumpcode 将跳到 Shell code。 SEH 漏洞利用技术的执行流程如图 2 所示。
在编写基于 SEH 的 Exploit 之前,须定位 3 个偏移: (1)next SHE 域的偏移,用 jumpcode 覆盖。 (2)SE Handler 域的偏移,用指向 pop pop ret 指令串的 指针覆盖。 (3)放置 Shellcode 的偏移。 通常做法是用唯一模型字符串填充 Payload 来定位上 述 3 个偏移,引发缓冲区溢出,触发异常处理例程以及设 置断点,并察看寄存器 EIP 的值来精确定位 3 个偏移位置。 3.4 SEHOP 的绕过方法及限制 通过覆盖 SEH 结构绕过 SafeSEH 保护的典型利用方 法,其结果使 SEH 链表被拆分,但该方法对有 SEHOP 保 护机制的漏洞利用是不可行的[7]。 在典型的覆盖 SEH 结构方法中,SEH Handler 指向 pop pop ret 指令串,next SEH 中的栈地址被 jmp 06 nop nop 替 换,其中的 2 个 nop nop 字节主要用于填充字符,以构造 一个 DWORD 大小的有效栈地址。如果伪造 SEH 结构中 的该 DWORD 值指向的栈地址,那么就可伪造整个 SEH 链表,并控制下一个 SEH 结构以使此链表有效。 伪造 SEH 链表需考虑以下限制因素: (1)SEH Handler 应指向非 SafeSEH 保护模块。 (2)内存页必须可执行。 (3)SEH 链表不应被篡改,并且位于链表末端的 SEH 结构必须为特定值。 (4)所有的 SEH 结构应为 4-byte 对齐。 (5)最后一个 SEH 结构的 Handler 必须正确指向 ntdll 中的 ntdll!FinalExceptionHandler 例程。 (6)所有 SEH 指针必须指向栈中。 针对所有 SEH 结构必须为 4-byte 对齐,经分析只有 JE 指令匹配,该指令只有当 Z 标志被设置时才跳转,在 Windows 处理异常时,Z 标志是默认关闭的,因此必须通 过执行指令来计算零值,以设置该标志位。XOR 指令是 最佳选择,因此可通过跳转至 XOR POP POP RET 指令串, 以便将 JE 指令解释为 JMP。XOR POP POP RET 指令串 可在返回空值的函数的末端来寻找。 由以上分析得出,可通过以下操作实现绕过 SEHOP 机制: (1)伪造一个有效的 SEH 链表。 (2)将最后一个 SEH 结构中的 Handler 指向 ntdll!Final ExceptHandler 函数。 (3)在栈中放置 Shellcode。 (4)定位内存中的 XOR POP POP RET 指令串地址。
SafeSEH 技术的推出可有效阻止利用 SEH 的 Exploit。 如前所述,如果修改后的异常处理例程无法通过验证,将 不会被调用,从而无法跳转到 Shellcode 去执行利用代码。
SEHOP 保护机制引入后,借助其强大的健壮性, Microsoft 发布了一款补丁,以使所有程序在缺省状态下 启用该安全机制[4]。如果利用 jmp 06 pop pop ret 指令覆盖 SEH 结构,则 SEH 结构链表的完整性遭到破坏,SEHOP 就能检测到异常从而阻止 Shellcode 的运行。
此外,微软在 Windows Vista Service Pack 1 以及 Windows 7 等系 统中 引入 了另 一种 新的 保护 机制 —— SEHOP[1],其核心特性是检测 SEH 结构链表的完整性, 特别是对最后一个 SEH 结构的检测。因为在该结构中拥 有一个特殊的异常处理函数指针,指向位于 ntdll 模块中 的函数 ntdll!FinalExceptHandler,从而实现抵御攻击者利 用 SEH 覆盖技术。
Shellcode[2]是具有特定功能的指令集,缓冲区溢出漏 洞主要采取将 Shellcode 注入被攻击程序来实现。因此, 如何在被攻击程序中嵌入 Shellcode 并使其执行是漏洞利 用技术的关键。
本文从攻击者的角度总结了 SEH 漏洞利用的关键技 术,包括绕过 SafeSEH 和 SEHOP 保护机制的方法,并论 述如何使程序执行流程跳转到利用漏洞的 Shellcode 代码 的常用方法。
图 2 SEH 漏洞利用技术的执行流程
当异常发生时,程序会跳转到 SE Handler 去执行,在 SE Handler 中伪造一个二次异常(pop pop ret 指令串),从
第 38 卷 第 20 期
吴伟民,郭朝伟,黄志伟,等:基于 Windows 的结构化异常处理漏洞利用技术
7
而使流程跳转到 next SEH pointer。next SEH 域位于 SE Handler 域之前,将先被覆盖,Shellcode 位于 SE Handler 之后。用 pop pop ret 指令串覆盖 SE Handler,该指令串将 next SEH 的地址放到 EIP 中,从而使 next SEH 中的指令 得到执行。next SEH 域中的指令跳过 SE Handler 域,最终 使 Shellcode 得到执行。 3.3 偏移定位
Vulnerability Exploitation Technology of Structured Exception Handling Based on Windows
WU Wei-min, GUO Chao-wei, HUANG Zhi-wei, SU Qing, CHEN Qiu-wei (Faculty of Computer, Guangdong University of Technology, Guangzhou 510006, China)
SafeSEH 能有效地保护 SEH 不被利用,但也存在如 下缺陷:
Fra Baidu bibliotek
(1)需要 Microsoft. NET 编译器的支持,对由其他编译 器生成的 PE 文件则无法加入 SafeSEH 保护[6]。
(2)仍有众多 Windows 组件没有加入该技术,进程中 只要有一个组件存在漏洞且没有 SafeSEH 保护,攻击者 仍可通过覆盖 SEH 节点控制程序流程,进而威胁到整个 进程。
只启用 SafeSEH 保护机制是可以被绕过的,经总结 有以下方法:
(1)在 Exploit 中不利用 SEH,而是通过覆盖返回地址 的方法来实施。
(2)利用堆地址覆盖 SEH 结构。在禁用数据执行保护 的进程中,异常分发例程允许 SEH handler 位于某些非映 像页面,意味着可以把 Shellcode 放置在堆中,并通过覆 盖 SEH 跳至堆空间以执行 Shellcode。
【Abstract】This paper discusses the Structured Exception Handling(SEH) and related protection mechanism, from the perspective of attackers, summarizes the technology of SEH vulnerability exploitation. It uses heap addresses or addresses outside of protection modules to overwrite the pointer of SEH handles to bypass SafeSEH, and fakes SEH chain to bypass SEHOP. It analyzes some major methods of making program execution flow locate the Shellcode. Example verifies the effectiveness of the SHE vulnerability exploitation technology. 【Key words】Structured Exception Handling(SEH); SafeSEH mechanism; SEHOP mechanism; vulnerability exploitation technology; Shellcode location DOI: 10.3969/j.issn.1000-3428.2012.20.002
3 SEH 漏洞利用技术
当存在 SafeSEH、SEHOP 保护以及 XOR 机制时,则 不能简单地通过跳转到寄存器来实现利用,而要通过调用 加载模块中的相关指令来达到目的[5]。应首选程序自身模 块中的相关指令地址编写可靠的 Exploit,这样每次使用 的地址几乎是一样的,而不受操作系统版本的影响。但如 果程序本身没有 DLL,那么使用没有 SafeSEH 保护的系 统 DLL,并且该 DLL 有满足需要的指令,也是可行的。 3.1 SafeSEH 的缺陷及绕过方法
———————————— 作者简介:吴伟民(1956-),男,教授,主研方向:信息安全,数据结构,可视计算,虚拟机技术;郭朝伟,硕士研究生;黄志伟,本科生; 苏 庆,讲师;陈秋伟,本科生 收稿日期:2011-12-02 修回日期:2012-02-20 E-mail:sunny8705@126.com
吴伟民,郭朝伟,黄志伟,苏 庆,陈秋伟 (广东工业大学计算机学院,广州 510006)
摘 要:论述基于 Windows 的结构化异常处理(SEH)及相关保护机制,从攻击者的角度总结 SEH 漏洞利用技术。利用堆地址或保护模块之 外的地址覆盖 SEH 句柄指针,绕过 SafeSEH 机制,伪造 SEH 链,绕过 SEHOP 机制,并分析使程序执行流程定位到 Shellcode 的方法。实 例验证了 SEH 漏洞利用技术的有效性。 关键词:结构化异常处理;SafeSEH 机制;SEHOP 机制;漏洞利用技术;Shellcode 定位