CTFshow栈溢出实战:从ORW到ret2syscall的完整攻击链解析
最近在CTFshow平台上刷题,发现从pwn69到pwn72这几道题,恰好构成了一条从基础到进阶的栈溢出攻击学习路径。很多刚接触PWN的朋友,面对ORW、ret2syscall这些术语时,常常觉得概念抽象,不知道如何下手。其实,这些技术背后是一套清晰的逻辑:如何在各种安全机制的限制下,通过控制程序执行流,最终实现我们的目标——比如读取一个flag文件,或者拿到一个shell。
这几道题的设计很巧妙,它们逐步引入了不同的限制条件和技术要点。pwn69让你在沙箱环境下,通过ORW技术绕过execve的限制去读文件;pwn70则增加了输入字符的过滤,考验你对shellcode编码的理解;pwn71和pwn72则转向了经典的ret2syscall攻击,分别在有无现成/bin/sh字符串的场景下,教你如何构造ROP链来执行系统调用。这不仅仅是解题,更是在教你一套完整的、模块化的漏洞利用方法论。无论你是想入门二进制安全,还是想系统性地梳理栈溢出攻击的各种姿势,跟着这条线走一遍,收获都会非常大。
1. 环境准备与工具链搭建
工欲善其事,必先利其器。在开始分析具体的漏洞和构造利用之前,一个稳定、高效的工具环境是必不可少的。对于Linux平台下的PWN题,尤其是涉及沙箱和系统调用分析的题目,以下几类工具构成了我们的核心武器库。
调试与反汇编工具:gdb配合pwndbg或peda插件是动态调试的标配。它们能提供直观的寄存器、栈、内存视图,以及强大的断点、单步、回溯功能。对于静态分析,objdump、readelf和IDA Pro(或开源的Ghidra、radare2)则用于查看程序结构、函数逻辑和关键地址。
安全检查与信息收集:checksec脚本是第一步,它能快速告诉我们目标程序开启了哪些安全机制,比如栈保护(Canary)、数据执行保护(NX)、地址空间布局随机化(PIE)等。这直接决定了我们后续的攻击思路。例如,NX开启意味着我们不能直接执行栈上的代码,需要转向ROP等技术。
针对沙箱分析的特殊工具:当题目提示或我们怀疑存在系统调用过滤时,seccomp-tools就派上用场了。它可以直接dump出程序加载的seccomp规则,让我们清晰地看到哪些系统调用被允许,哪些被禁止。这对于构造ORW这类受限的利用链至关重要。
提示:在Kali或Ubuntu等系统上,可以通过
sudo gem install seccomp-tools来安装。安装后,使用seccomp-tools dump ./pwn_binary即可查看规则。
自动化ROP链构造工具:虽然手动寻找gadget是基本功,但在复杂场景下,ROPgadget或ropper这类工具能极大提升效率。它们可以扫描二进制文件,找出所有以ret结尾的有用指令片段,并支持按需搜索,比如pop eax; ret或syscall指令的地址。
为了方便大家快速搭建环境,下面是一个基本的工具安装和检查清单:
- pwntools: Python的漏洞利用开发库,几乎贯穿所有利用脚本。
pip install pwntools - pwndbg: 增强的GDB插件。
git clone https://github.com/pwndbg/pwndbg cd pwndbg && ./setup.sh - seccomp-tools: Seccomp规则分析工具。
sudo gem install seccomp-tools - ROPgadget: 自动化查找gadget。
pip install ROPgadget
准备好这些工具,我们就能从容地面对接下来的挑战了。每一道题的分析,都将是这些工具组合应用的实际演练。
2. 沙箱逃逸与ORW技术精讲
在pwn69这道题里,我们第一次遇到了“沙箱”(Sandbox)。简单来说,沙箱就是一种安全机制,它给运行的程序套上一个“笼子”,限制其能进行的操作,最常见的就是限制可以使用的系统调用。seccomp(Secure Computing Mode)就是Linux内核实现这种机制的一种方式。题目用seccomp禁用了execve系统调用,这意味着我们即使能控制程序执行流,也无法直接通过execve("/bin/sh")来获得一个shell。
这时候,ORW技术就登场了。ORW是Open-Read-Write的缩写,它的核心思想非常直接:既然不让我执行新程序,那我就用程序本身已有的权限去“读”文件。通常,flag文件就放在当前目录或某个固定路径。ORW通过连续调用三个系统调用来实现目标:
- open(filename, flags): 打开目标文件(如
./ctfshow_flag),获得一个文件描述符(fd)。</
1670



被折叠的 条评论
为什么被折叠?



