睿诚科技协会

ASLR/DEP绕过技术有哪些核心方法?

目录

  1. 基础概念:什么是 ASLR 和 DEP?

    ASLR/DEP绕过技术有哪些核心方法?-图1
    (图片来源网络,侵删)
    • 地址空间布局随机化
    • 数据执行保护
    • 为什么它们是现代操作系统的标配?
  2. 绕过技术的演进:从简单到复杂

    • 第一阶段:信息泄露
      • 原理:让 ASLR 失效
      • 常见漏洞类型:格式化字符串、UAF/Use-After-Free、信息泄露型整数溢出
      • 工具:grep, pwntools
    • 第二阶段:控制流劫持
      • 原理:在已知地址执行未知代码
      • 经典技术:Return-Oriented Programming
      • 现代技术:JOP, COP, Type Confusion
    • 第三阶段:内存破坏
      • 原理:绕过 DEP,让数据区域能够执行代码
      • 技术分类:堆喷射、堆风水、代码复用
      • 平台特定技术:Windows 的 ETW / CFG
  3. 现代 Windows 平台的深度防御与绕过

    • CFG (Control Flow Guard):最强大的防线之一
    • ETW (Event Tracing for Windows):默默无闻的监控者
    • Shadow Stack / CET (Control-Flow Enforcement Technology):硬件级解决方案
    • SEHOP (Structured Exception Handler Overwrite Protection):针对 SEH 攻击的防护
  4. 其他平台的防护与绕过

    • Linux
      • execstack / NX bit
      • ASLR (内核态与用户态)
      • seccomp, SELinux
    • macOS / iOS
      • ASLR (更强的随机化)
      • Page Zero
      • Stack Canaries
      • PIE (Position-Independent Executable)RELRO (Relocation Read-Only)
  5. 攻防螺旋的永恒斗争

    ASLR/DEP绕过技术有哪些核心方法?-图2
    (图片来源网络,侵删)

基础概念:什么是 ASLR 和 DEP?

地址空间布局随机化

ASLR 是一种内存保护机制,它在程序每次启动时,随机化以下关键内存区域的基地址:

  • 可执行文件
  • 动态链接库

目的:攻击者无法预测关键代码或数据的地址,从而难以进行精确的内存地址覆盖和跳转,经典的重写返回地址攻击在开启 ASLR 后变得几乎不可能。

数据执行保护

DEP 是一种硬件和软件结合的技术,它将内存页标记为“不可执行”(No-Execute, NX),这意味着:

  • 代码段:通常是可读、可执行的。
  • 数据段(如 .data, .bss, 栈,堆):通常是可读、可写的,但不可执行

目的:防止攻击者在数据区域(如堆、栈)注入恶意代码(Shellcode)并执行它,即使攻击者成功利用漏洞(如缓冲区溢出)将 Shellcode 写入栈中,DEP 也会阻止 CPU 执行这些指令。

ASLR/DEP绕过技术有哪些核心方法?-图3
(图片来源网络,侵删)

为什么它们是标配? ASLR 和 DEP 形成了一个强大的组合,极大地提高了内存漏洞利用的门槛,是现代操作系统安全的基础。


绕过技术的演进:从简单到复杂

第一阶段:信息泄露

这是最经典的绕过 ASLR 的方法,攻击者的目标是利用程序自身的漏洞,泄露出一个或多个关键内存区域的基地址

  • 原理:一旦获得了基地址,攻击者就可以计算出所有其他相关地址(如函数地址、ROP gadgets 地址),从而将 ASLR 的随机化优势化为乌有。
  • 常见漏洞类型
    • 格式化字符串漏洞:通过 %p%x 等格式化字符串直接打印出栈上的地址。
    • UAF (Use-After-Free):释放一个对象后,攻击者仍然可以访问它,通过观察内存分配器的行为(如 tcachefastbin 的复用),可以推断出堆的布局和地址。
    • 信息泄露型整数溢出:可能导致读取到超出边界的内存,从而泄露地址。
  • 工具
    • pwntools (Python): leak() 函数可以方便地解析泄露的地址。
    • gdb-peda / GEF: leak 命令用于快速定位和解析泄露的地址。
    • grep: 在二进制文件中搜索硬编码的字符串地址,与泄露的地址相减,可以计算出程序的基址。

第二阶段:控制流劫持

在地址泄露后,攻击者需要一种方法来执行他们的恶意载荷,同时绕过 DEP,直接跳转到 Shellcode 是行不通的,因为 DEP 会阻止执行。

  • 原理:不执行攻击者自己编写的 Shellcode,而是重用程序自身或其库中已有的代码片段,组合成一个功能完整的攻击链。
  • 经典技术:Return-Oriented Programming (ROP)
    • 核心思想:在程序的代码段(通常是 .text)中寻找大量的“小代码片段”(称为 gadgets),每个 gadget 以 ret 指令结尾。
    • 工作方式:攻击者精心挑选一系列 gadgets,将它们的地址按顺序压入栈中,当程序执行到第一个 gadget 时,它会执行一些操作(如 pop rax; ret;),ret 指令会从栈顶弹出下一个地址,跳转到下一个 gadget,如此循环。
    • 绕过 DEP:因为所有执行的代码都来自合法的、可执行的内存区域,所以完全绕过了 DEP。
    • 应用:可以用来调用 system(), execve() 等函数,或者直接进行内存读写。
  • 现代技术:
    • JOP (Jump-Oriented Programming):与 ROP 类似,但使用 jmpcall 指令结尾的 gadgets,可以提供更灵活的代码流控制。
    • COP (Code-Reuse):更广义的术语,包括 ROP, JOP 等。
    • 类型混淆:利用语言特性(如 C++ 的虚函数表)或逻辑漏洞,让程序执行一个预期之外的代码路径,从而劫持控制流。

第三阶段:内存破坏

在某些情况下,攻击者可能无法进行信息泄露,或者 ASLR 随机化范围过大,使得泄露变得困难,这时,他们需要一种方法来绕过 DEP,在数据区域能执行代码

  • 原理:利用特定漏洞或平台特性,在堆、栈等数据区域创建一个可执行的内存环境。
  • 技术分类
    • 堆喷射:一种经典的、但已部分过时的技术,通过在堆上大量分配包含 Shellcode 的内存块,并控制其布局,当漏洞触发时(如栈溢出覆盖返回地址),攻击者可以猜测一个大概率指向 Shellcode 的地址,由于 Windows 7/8 的 ASLR 堆随机化增强,此技术效果大打折扣。
    • 堆风水:对堆喷射的改进,通过精确控制堆块的分配和释放顺序,来预测和布局堆内存,使得漏洞触发时能精确地跳转到 Shellcode 地址。
    • 代码复用:这是目前最主流、最可靠的技术,核心就是 ROP,它不依赖于在数据区创建可执行内存,而是直接复用代码区的指令。

现代 Windows 平台的深度防御与绕过

Windows 在 ASLR/DEP 的基础上,引入了更多主动防御机制,使得漏洞利用变得异常困难。

CFG (Control Flow Guard)

  • 是什么:由编译器(如 MSVC)和操作系统共同实现的一种机制,它维护一个合法的间接跳转目标地址的“白名单”(通常是导入的函数地址)。
  • 如何工作:在程序执行 call [rax]jmp [rbx] 这样的间接跳转指令前,CPU 会检查目标地址是否在 CFG 的白名单中,如果不在,程序会立即终止。
  • 如何绕过
    1. 绕过 CFG 检查:寻找 CFG 保护的漏洞,例如通过类型混淆或内存破坏来篡改虚函数表或虚指针,使得程序调用一个受 CFG 保护的函数,但参数被精心构造,导致该函数内部发生二次内存破坏,从而绕过 CFG 的直接检查。
    2. 利用未受保护的代码:寻找程序中没有被 CFG 保护的间接跳转点,某些 JIT(即时编译)代码、动态生成的代码或第三方库。
    3. CFG 漏洞:CFG 实现本身存在漏洞,攻击者可以伪造白名单。

ETW (Event Tracing for Windows)

  • 是什么:一个强大的内核级事件追踪框架,微软利用它来监控和记录进程的关键行为,如模块加载、线程创建、API 调用等。
  • 如何工作:安全软件(如 Windows Defender Exploit Guard)可以订阅 ETW 事件,并设置规则,当一个进程尝试加载一个非微软签名的、非本地的 DLL 时,ETW 会触发警报并可能终止该进程。
  • 如何绕过
    1. 禁用 ETW:通过调用 NtTraceControl 等底层 API 来禁用 ETW 提供商。
    2. 绕过监控:精心构造攻击载荷,使其行为看起来像是合法操作,避免触发 ETW 规则。
    3. 直接内存操作:不使用 LoadLibrary 等可能被监控的 API,而是通过直接读写内存来加载和执行代码。

Shadow Stack / CET (Control-Flow Enforcement Technology)

  • 是什么:由 Intel 和 AMD CPU 硬件支持的新一代控制流保护技术。
  • 如何工作:CPU 维护一个与普通栈平行的“影子栈”,当函数调用发生时,返回地址会被同时压入普通栈和影子栈,当函数返回时,CPU 会比较两个栈顶的返回地址是否一致,如果不一致,说明发生了栈溢出等攻击,程序会终止。
  • 如何绕过
    • 这是目前最难绕过的技术之一,因为它由硬件强制执行。
    • 绕过方法通常非常复杂,
      • 利用硬件漏洞:利用 CPU 本身的缺陷(如某些 Speculative Execution 漏洞)。
      • 同时破坏普通栈和影子栈:需要非常精确的漏洞利用,才能同时覆盖两个栈上的返回地址。
      • 绕过函数调用机制:利用 setcontextswapcontext 等能直接修改整个上下文的函数,绕过标准的 call/ret 机制。

SEHOP (Structured Exception Handler Overwrite Protection)

  • 是什么:针对 SEH 覆盖攻击的保护。
  • 如何工作:程序启动时,操作系统会计算一个所有 SEH 处理程序链的哈希值,在触发异常时,程序会重新计算这个哈希值并与初始值比较,如果不匹配,说明 SEH 链被篡改。
  • 如何绕过:攻击者需要找到一种方法,在不破坏整个 SEH 链完整性的情况下实现攻击,这在现代 Windows 上已非常罕见。

其他平台的防护与绕过

Linux

  • NX bit: Linux 上 DEP 的实现,通过 execstack 工具或编译选项控制。
  • ASLR: 内核态和用户态 ASLR,用户态 ASLR 可以通过 /proc/sys/randomize_va_space 调整级别(0=关闭,2=全开)。
  • ASLR Leak: 和 Windows 类似,信息泄露是绕过 ASLR 的主要手段。
  • seccomp: 限制系统调用,减少攻击面。
  • SELinux/AppArmor: 强制访问控制,限制进程能访问的资源。

macOS / iOS

  • ASLR: 通常比 Windows 和 Linux 更强,随机化范围更大,信息泄露更困难。
  • Page Zero: .data 段和 .bss 段之间有一个零页,用于捕获空指针解引用。
  • Stack Canaries (Stack Cookies): 在函数返回地址之前插入一个随机值(Cookie),函数返回前会检查这个值是否被修改,如果被修改,说明栈溢出发生,程序终止。
  • PIE (Position-Independent Executable): 程序的代码段地址也是随机的,是 ASLR 的一部分。
  • RELRO (Relocation Read-Only): 分为 Partial RELROFull RELROFull RELRO 会在程序启动后将 .got 表(全局偏移表)设置为只读,防止攻击者修改函数地址(如 printf -> system)。

攻防螺旋的永恒斗争

ASLR/DEP 的绕过技术是一个典型的“矛与盾”的攻防螺旋。

  • 早期 (2000s 初):ASLR/DEP 的出现,终结了简单的栈溢出攻击。
  • 中期 (2000s 中 - 2010s)信息泄露 + ROP 成为绕过 ASLR/DEP 的黄金标准。
  • 现代 (2010s 中 - 至今):Windows 引入 CFG、ETW、CET 等深度防御机制,使得漏洞利用成本急剧上升,攻击者也发展出更复杂的绕过技术,如 CFG 绕过、CET 绕过研究等。

未来的趋势

  • 硬件级防御:如 Intel 的 CET 和 AMD 的 CET,将防御推向硬件层面,绕过难度极高。
  • AI 辅助防御:利用机器学习检测异常的内存访问模式和代码行为。
  • 更强大的沙箱:将应用程序运行在隔离环境中,即使漏洞被利用,也无法影响系统。

对于安全研究人员和开发者而言,理解这些技术至关重要,它不仅能帮助我们构建更安全的软件,也能让我们在发现漏洞时,更好地评估其真实世界的影响和利用难度。

分享:
扫描分享到社交APP
上一篇
下一篇