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系统调用,一次性设置所有寄存器状态,实现复杂的利用链。 - 关键点:
- 栈帧(frame)位于高地址,返回地址指向
sigreturn调用。 - 默认执行伪造的frame栈帧,与
ret2shellcode的执行方式有本质区别。
- 栈帧(frame)位于高地址,返回地址指向
关卡五:ret2dlresolve
- 描述:通过伪造动态链接解析过程(
_dl_runtime_resolve)所需的结构体,实现无需泄露libc地址即可调用任意库函数。 - 关键点:
- 调用
read等函数写入伪造结构体时,必须注意rdx寄存器的数值,确保有足够的字节数被写入,否则伪造的结构体不完整会导致利用失败。
- 调用
关卡六:ret2hellor
- 描述:一种利用
puts等输出函数来泄露地址的手法。 - 关键限制:该手法要求
puts函数内部存在额外的mov eax, rdi汇编指令片段。如果目标程序的puts实现中没有这条指令,则此手法不可用。文档明确提到,演示题目因为没有这个指令片段,所以无法使用此手法。
关卡七:ret2all
- 描述:结合SROP等多种技术的综合性利用手法。
- 实现方式:
- 单次SROP:相对简单,布局一次执行流程。
- 多次SROP:
- 可以布局好一次调用一次,逐步推进。
- 也可以调用
read一次性写入大量数据,然后连续执行。 - 文档提到,之前多采用提前布局的“堆风水”方式,未来遇到可以尝试第二种(一次性写入)方式。
- 模板说明:文档提供了一个最简单的模板。
/bin/sh字符串需要攻击者自行写入,然后使用写入bss段的地址即可。 - 原理:核心原理相同。如果目标程序禁用了
execve,则需要调整寄存器的数值,根据给出的内存布局图进行微量修改即可实现利用。文档包含一张关键的内存布局示意图,但链接内容显示“图片加载失败”,实践中需参考原文或自行分析布局。
第二部分:现代堆利用技术
实验源码位于“现代堆”章节。
关卡一:UAF + IO
- 描述:利用Use-After-Free漏洞结合IO_FILE结构体进行利用。
- 关键细节:当通过
malloc申请大小为0x400的chunk时,该chunk会进入tcache(线程本地缓存)。 - 提供模板:文档提供了两种高级利用手法的模板:
- 最基础的largebin attack模板。
- apple2(最小空间利用)模板。
关卡二:溢出+IO
- 描述:本质上是构造出UAF条件,然后结合IO_FILE利用。
- 实验修改:在实验源码的基础上,增加一个
delete操作并确保指针被清零,以模拟更真实的漏洞场景。
第三部分:现代格式化字符串漏洞利用
实验源码位于“现代格式化字符串”章节。文档指出,栈上和非栈上的利用仅需略微修改即可。
关卡一:栈上通解
- 方法:直接使用
fmt_payload构造利用链。 - 利用目标:修改以下两个返回地址以实现程序“重启”:
- 进入
exit流程的返回地址。 - 调用
.fini_array[0]的地址。
- 进入
- 攻击流程:
- 第一次“重启”:将
.fini_array[0]改为main函数地址。 main函数返回后,程序回到退出流程。- 第二次“重启”:将
_fini函数的地址也改为main函数地址。 - 再次从
main返回,最终回到退出流程。通过这种方式可以维持程序控制流循环。
- 第一次“重启”:将
关卡二:非栈上通解
- 核心步骤:
- 第一次泄露+重启:利用
.fini_array这个天然存在于栈上的地址点,进行地址泄露并实现第一次程序重启。 - 第二次修改返回地址测试。
- 第三次修改返回地址+半字节ROP链铺垫:为后续更复杂的ROP攻击做准备。
- 第一次泄露+重启:利用
第四部分:FILE结构体利用
实验源码位于“FILE结构体”章节。
关卡:利用stdin覆写stdout
- 描述:通过伪造
stdin(_IO_2_1_stdin_)结构体,进而覆写stdout(_IO_2_1_stdout_)结构体,最终控制程序执行流。 - 伪造条件:
- 文档提到一种通过
read函数写入来伪造stdin结构体的情况。因为是通过read写入,所以需要同时伪造其虚表(vtable)。 - 实际比赛中更常见的情况是:通过
scanf等函数进行写入,并且攻击者通常能获得一个“任意地址写某个字节”的能力。这种效果与伪造整个stdin结构体类似,此时只需要关注几个关键的地址即可。
- 文档提到一种通过
- 利用链构造:
- 对于
stdout,核心是构造一条从_IO_file_jumps(或相关结构)到目标gadget的链。具体为:设置好magicgadget-> 指向伪造的fake_xdr_ops_addr-> 最终跳转到add rsp, ...等栈调整gadget,从而劫持控制流。
- 对于
总结
本文档系统性地总结了现代PWN挑战中常见的核心利用手法,从栈溢出到堆利用,从格式化字符串到IO_FILE攻击,提供了清晰的实验路径和关键注意事项。这些手法的“模版化”旨在帮助安全研究人员在面对不同保护机制和漏洞场景时,能够快速适配并构建有效的攻击载荷。所有实验均基于glibc 2.35环境,为理解和利用现代二进制程序的漏洞提供了实践基础。
相似文章
相似文章