CTFshow栈溢出实战:从ORW到ret2syscall的进阶利用

1. 从ORW到ret2syscall:栈溢出利用的两种高级思路

玩CTF的PWN题,尤其是CTFshow的栈溢出系列,经常会在绕过各种保护机制上卡壳。我自己刚开始做的时候,看到NX、Canary、Seccomp这些名词就头疼,更别说在它们同时存在的情况下拿到flag了。后来在实战中,特别是从pwn69做到pwn72这几道题,我才算真正搞明白了两种非常核心的高级利用技术:ORWret2syscall。这俩名字听起来挺唬人,其实拆开了看,就是“用不同的姿势让程序帮你干活”。

简单来说,当程序开了NX保护,栈上的数据不能直接当代码执行时,你该怎么办?ORW和ret2syscall给出了两种不同的解题路径。ORW更像是一种“曲线救国”的策略,它不直接执行系统命令,而是通过组合openreadwrite这三个最基础的系统调用,把flag文件的内容一点点“搬运”出来给你看。而ret2syscall则是一种更“霸道”的方法,它通过精心构造一串指令片段(ROP链),直接操控CPU的寄存器,最终执行一个完整的系统调用(比如execve)来拿到shell,从而为所欲为。

这两种技术并不是谁替代谁的关系,而是应对不同场景的“组合拳”。比如,题目如果用了Seccomp沙箱,明确禁止了execve这类危险调用,那ret2syscall直接拿shell的路就走不通了,这时候ORW这种“文件搬运工”的思路就成了唯一的选择。反过来,如果程序没开沙箱,但NX保护让你没法在栈上执行自己的shellcode,那么ret2syscall这种纯数据攻击、不依赖注入代码的方式就大显身手了。下面,我就结合CTFshow的pwn69到pwn72这四道典型的题目,带你一步步拆解这两种技术的实战应用,把原理和操作都掰开揉碎了讲清楚。

2. pwn69:在沙箱限制下用ORW“偷”出flag

pwn69这道题是一个非常好的ORW技术入门案例。拿到题目,我习惯先用checksec看看程序穿了哪些“盔甲”。不过这道题的重点其实不在常见的NX、Canary上,而在于题目描述里的那句提示:“可以尝试用ORW读flag”。这通常意味着程序内部可能设置了Seccomp沙箱

2.1 理解Seccomp沙箱与ORW的生存空间

Seccomp(安全计算模式)是Linux内核的一个安全机制,它允许程序给自己“戴上镣铐”,限制自己能调用的系统调用。比如,一个只需要读写文件的程序,完全可以把execve(执行程序)、fork(创建进程)这些高危调用给禁掉,这样即使被攻击者控制了程序流程,也翻不起太大浪花。

怎么知道程序用了哪些限制呢?这里就要用到seccomp-tools这个神器。在Kali Linux里安装很简单:sudo gem install seccomp-tools。安装后,对目标程序运行seccomp-tools dump ./pwn69,就能看到清晰的过滤规则。在pwn69里,规则很可能只允许openreadwriteexit等少数几个调用,而明确禁止了execve。这就是为什么题目提示用ORW——因为拿shell的路被彻底堵死了,你只能通过“打开文件->读取内容->写到屏幕”这个合规操作来获取flag。

ORW的本质,就是手动实现一个极简的cat命令。它的汇编逻辑非常直白:

  1. Open:用sys_open系统调用打开目标文件(比如/ctfshow_flag),获得一个文件描述符(fd)。这个fd通常从3开始(0、1、2已被标准输入、输出、错误占用)。
  2. Read:用sys_read系统调用,从刚才获得的fd中读取文件内容,存放到一块你可以控制的内存地址(比如通过mmap申请的内存区域)。
  3. Write:用sys_write系统调用,将内存中读到的内容,写到文件描述符为1的标准输出(也就是你的终端屏幕)。

2.2 构造与注入:让程序跳转到我们的shellcode

知道了要做什么,接下来就是怎么让程序去做。pwn69通常没有开启NX(No-Execute),意味着栈上的数据是可以被当作代码执行的。这给我们注入shellcode提供了可能。但光有shellcode还不够,我们需要劫持程序的控制流,让它去执行我们布置在栈上的这些指令。

这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值