Windows堆栈溢出缓解技术

Windows堆栈溢出缓解技术

[TOC]

NX/DEP

原理

No-Execute (NX) / 数据执行防护(DEP, Data Execution Prevention)。
通过阻止代码从标记为非可执行文件的内存执行来防止缓冲区溢出攻击。(栈上的数据没有执行权限)

绕过方式

  • ROP
  • SEH

Canary / GS

原理

在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查CANARY这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻击。

1
2
3
4
5
6
7
8
9
10
11
12
   High Address |                 |
+-----------------+
| args |
+-----------------+
| return address |
+-----------------+
rbp => | old ebp |
+-----------------+
rbp-8 => | canary value |
+-----------------+
| local variables |
Low Address | |

绕过方式

  • 泄露栈中的 Canary
  • one-by-one 爆破 Canary
  • 劫持__stack_chk_fail 函数
  • 覆盖 TLS 中储存的 Canary 值

ASLR

原理

Address Space Layout Randomisation

通俗讲就是地址随机化,让exe和dll的地址全部随机,所以就有了大名鼎鼎Heap Spray(堆喷)利用技术,Heap Spray是在shellcode的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。

绕过

  • 堆喷射

Dynamic Base

程序编译时可通过/DYNAMICBASE编译选项指示程序是否利用ASLR的功能

https://github.com/trailofbits/winchecksec/blob/master/checksec.cpp#L171

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const MitigationReport Checksec::isDynamicBase() const {
if (dllCharacteristics_ & peparse::IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) {
return REPORT(Present, kDynamicBaseDescription);
} else {
return REPORT(NotPresent, kDynamicBaseDescription);
}
}

const MitigationReport Checksec::isASLR() const {
// A binary is ASLR'd if:
// * It was linked with /DYNAMICBASE and has *not* had its relocation
// entries stripped, or
// * It's managed by the CLR, which is always ASLR'd. (Common Language Runtime (CLR))
if (isDynamicBase()) {
if (imageCharacteristics_ & peparse::IMAGE_FILE_RELOCS_STRIPPED) {
return REPORT_EXPLAIN(NotPresent, kASLRDescription,
"Image has stripped relocations, making ASLR impossible.");
}
return REPORT(Present, kASLRDescription);
} else if (isDotNET()) {
return REPORT_EXPLAIN(Present, kASLRDescription,
".NET binaries have ASLR via the .NET runtime.");
} else {
return REPORT(NotPresent, kASLRDescription);
}
}

High Entropy VA

如果指定此选项,则当内核将进程的地址空间布局随机化为 ASLR 的一部分时,兼容版本的 Windows 内核可以使用更高的熵。 如果内核使用更高的熵,则可以将更多的地址分配给堆栈和堆等内存区域。 因此,更难猜测特定内存区域的位置。当该选项打开时,当这些模块作为 64 位进程运行时,目标可执行文件和它所依赖的任何模块必须能够处理大于 4 GB 的指针值。

SEH

结构化异常处理(Structured Exception Handling,简称 SEH)是一种Windows 操作系统对错误或异常提供的处理技术。SEH 是 Windows操作系统的一种系统机制,本身与具体的程序设计语言无关。SEH 为Windows的设计者提供了程序错误或异常的处理途径,使得系统更加健壮

SafeSEH

为了防止攻击者通过覆盖堆栈上的异常处理函数句柄,从而控制程序执行流程的攻击,在调用异常处理函数之前,对要调用的异常处理函数进行一系列的有效性校验,如果发现异常处理函数不可靠,立即终止异常处理函数的调用。不过SafeSEH需要编译器和系统双重支持,缺少一个则保护能力基本就丧失了

Force Integrity

强制签名保护

Control Flow Guard

控制Flow防护 (CFG) 是一项高度优化的平台安全功能,旨在打击内存损坏漏洞。 通过严格限制应用程序可以从何处执行代码,利用漏洞(如缓冲区溢出)执行任意代码会更加困难

Isolation

隔离保护,默认会开启

Authenticode

签名保护

参考链接

https://xz.aliyun.com/t/11865