PWN核心利用手法归纳总结
字数 3022
更新时间 2026-04-22 12:45:23

PWN核心利用手法归纳总结教学文档

文档概述

本文档基于阿里云先知社区(https://xz.aliyun.com/news/91995)发布的《PWN核心利用手法归纳总结》整理而成,系统性地介绍了现代PWN利用的核心技术。本教学文档旨在提供一套完整的、可复现的PWN技术框架,涵盖栈、堆、格式化字符串、FILE结构体等多个方面的利用手法。

核心宗旨

本文档介绍的利用手法是“大保底的通用手法”,而非依赖特定程序保护或情境的技巧。目标是提供一套“模版”,降低测试漏洞可行性的成本,使安全研究人员能够快速回忆和应用这些技术。实验模型设置为“全漏洞、逆向成本几乎为零”的环境,专注于漏洞利用研究。

实验环境配置

  • 系统库:使用首次经历重大变革后的glibc 2.35版本进行实验。文档明确说明,暂未选择二次大变革(2.42版本以上)的glibc,这为利用技术的普适性提供了参考基线。
  • 编译参考:题目编译需参考现代标准。

第一部分:现代栈利用技术

实验源码位于“现代栈”章节。

关卡一:ret2text

  • 描述:最基础的返回地址劫持技术,控制程序执行流跳转到程序本身已有的、包含可利用指令的代码段(.text段)。
  • 关键点:利用栈溢出漏洞覆盖函数的返回地址,使其指向目标函数或gadget。

关卡二:ret2libc

  • 描述:当目标程序本身没有提供如system/bin/sh时,通过跳转到动态链接库(libc)中的函数来获取shell的技术。
  • 关键点:通常需要先泄露libc基地址,然后计算目标函数(如system)的实际地址。

关卡三:ret2shellcode

  • 描述:将shellcode写入内存(通常通过栈溢出写入可写可执行的内存区域),然后劫持控制流执行该shellcode。
  • 关键点:需要存在可写且可执行的内存区域(如开启NX保护则此手法受限)。

关卡四:ret2srop

  • 描述:利用Sigreturn Oriented Programming技术。通过伪造signal frame并触发sigreturn系统调用,一次性设置所有寄存器状态,实现复杂的利用链。
  • 关键点
    1. 栈帧(frame)位于高地址,返回地址指向sigreturn调用。
    2. 默认执行伪造的frame栈帧,与ret2shellcode的执行方式有本质区别。

关卡五:ret2dlresolve

  • 描述:通过伪造动态链接解析过程(_dl_runtime_resolve)所需的结构体,实现无需泄露libc地址即可调用任意库函数。
  • 关键点
    1. 调用read等函数写入伪造结构体时,必须注意rdx寄存器的数值,确保有足够的字节数被写入,否则伪造的结构体不完整会导致利用失败。

关卡六:ret2hellor

  • 描述:一种利用puts等输出函数来泄露地址的手法。
  • 关键限制:该手法要求puts函数内部存在额外的mov eax, rdi汇编指令片段。如果目标程序的puts实现中没有这条指令,则此手法不可用。文档明确提到,演示题目因为没有这个指令片段,所以无法使用此手法。

关卡七:ret2all

  • 描述:结合SROP等多种技术的综合性利用手法。
  • 实现方式
    1. 单次SROP:相对简单,布局一次执行流程。
    2. 多次SROP
      • 可以布局好一次调用一次,逐步推进。
      • 也可以调用read一次性写入大量数据,然后连续执行。
      • 文档提到,之前多采用提前布局的“堆风水”方式,未来遇到可以尝试第二种(一次性写入)方式。
  • 模板说明:文档提供了一个最简单的模板。/bin/sh字符串需要攻击者自行写入,然后使用写入bss段的地址即可。
  • 原理:核心原理相同。如果目标程序禁用了execve,则需要调整寄存器的数值,根据给出的内存布局图进行微量修改即可实现利用。文档包含一张关键的内存布局示意图,但链接内容显示“图片加载失败”,实践中需参考原文或自行分析布局。

第二部分:现代堆利用技术

实验源码位于“现代堆”章节。

关卡一:UAF + IO

  • 描述:利用Use-After-Free漏洞结合IO_FILE结构体进行利用。
  • 关键细节:当通过malloc申请大小为0x400的chunk时,该chunk会进入tcache(线程本地缓存)。
  • 提供模板:文档提供了两种高级利用手法的模板:
    1. 最基础的largebin attack模板
    2. apple2(最小空间利用)模板

关卡二:溢出+IO

  • 描述:本质上是构造出UAF条件,然后结合IO_FILE利用。
  • 实验修改:在实验源码的基础上,增加一个delete操作并确保指针被清零,以模拟更真实的漏洞场景。

第三部分:现代格式化字符串漏洞利用

实验源码位于“现代格式化字符串”章节。文档指出,栈上和非栈上的利用仅需略微修改即可。

关卡一:栈上通解

  • 方法:直接使用fmt_payload构造利用链。
  • 利用目标:修改以下两个返回地址以实现程序“重启”:
    1. 进入exit流程的返回地址。
    2. 调用.fini_array[0]的地址。
  • 攻击流程
    1. 第一次“重启”:将.fini_array[0]改为main函数地址。
    2. main函数返回后,程序回到退出流程。
    3. 第二次“重启”:将_fini函数的地址也改为main函数地址。
    4. 再次从main返回,最终回到退出流程。通过这种方式可以维持程序控制流循环。

关卡二:非栈上通解

  • 核心步骤
    1. 第一次泄露+重启:利用.fini_array这个天然存在于栈上的地址点,进行地址泄露并实现第一次程序重启。
    2. 第二次修改返回地址测试
    3. 第三次修改返回地址+半字节ROP链铺垫:为后续更复杂的ROP攻击做准备。

第四部分:FILE结构体利用

实验源码位于“FILE结构体”章节。

关卡:利用stdin覆写stdout

  • 描述:通过伪造stdin_IO_2_1_stdin_)结构体,进而覆写stdout_IO_2_1_stdout_)结构体,最终控制程序执行流。
  • 伪造条件
    1. 文档提到一种通过read函数写入来伪造stdin结构体的情况。因为是通过read写入,所以需要同时伪造其虚表(vtable)
    2. 实际比赛中更常见的情况是:通过scanf等函数进行写入,并且攻击者通常能获得一个“任意地址写某个字节”的能力。这种效果与伪造整个stdin结构体类似,此时只需要关注几个关键的地址即可。
  • 利用链构造
    • 对于stdout,核心是构造一条从_IO_file_jumps(或相关结构)到目标gadget的链。具体为:设置好magicgadget -> 指向伪造的fake_xdr_ops_addr -> 最终跳转到add rsp, ...等栈调整gadget,从而劫持控制流。

总结

本文档系统性地总结了现代PWN挑战中常见的核心利用手法,从栈溢出到堆利用,从格式化字符串到IO_FILE攻击,提供了清晰的实验路径和关键注意事项。这些手法的“模版化”旨在帮助安全研究人员在面对不同保护机制和漏洞场景时,能够快速适配并构建有效的攻击载荷。所有实验均基于glibc 2.35环境,为理解和利用现代二进制程序的漏洞提供了实践基础。

相似文章
相似文章
 全屏