对二进制安全中沙盒的深入了解与分析(rop与shellcode集合)
sanmu 二进制安全 641浏览 · 2025-04-11 08:39

前言

起因

在每次遇到沙盒时都要重新写rop或者shellcode,这非常不健康,所以我写了这篇文章,尽可能的让这里的代码能拿来就能用。

在正篇里将直接用rop或shellcode中使用的函数进行命名,这样可以快速并清晰的找到要用的代码。

注意: open+read+write为模版,之后相对应的代码可以直接进行替换,比如pread64可以直接将read进行替换(活字印刷术)。

以下为例题程序



沙盒

沙盒是一种对程序的保护,他可以禁用一些系统调用从而增加pwn题目的难度,迫使pwner们通过ORW的方法进行绕过沙盒。比如最常见的禁用execve,那么就只能通过open,read,write来直接读取flag的内容。

沙盒检测

正篇

open+read+write

rop

shellcode

open替代

openat

rop

shellcode

openat2

rop

shellcode

read替代

pread

rop

shellcode

readv

rop

shellcode

preadv

rop

shellcode

mmap

rop

shellcode

sendfile

sendfile可以直接代替write与read

rop

shellcode

write替代

writev

rop

shellcode

sendfile

sendfile可以直接代替write与read

rop

shellcode

侧信道攻击

这个攻击比较特殊,实在没有输出手段的时候就利用此方法,此方法相当不准确,谨慎使用。


如果rop同上面一样使用

来转化成写shellcode


接下来看shellcode怎么写。



现在假设flag已经读到了栈上,但是没有办法读(没有系统调用 & close(1))。

那么可以进行爆破,因为没有返回,所以爆破就只能看时间来判断。

shellcode为读取文件的code。



很慢,但可行。

转32位

利用条件

沙箱没有arch==ARCH_x86_64检测

可以使用mmmap或者mprotect和32位的地址


rop

可以调用mprotect来转化成写shellcode


shellcode

绕过close(1)

侧信道攻击

同write替代中的侧信道攻击

远程链接socket&connect

有些程序会调用子进程,子进程对外开放,但是rop写后只能在主进程运行,输出没法显示在远程,或者close(1),那么可以用此方法,此方法需要公网ip

open("/dev/pts/?")

使用open("/dev/pts/?")重新打开标准输出

超级代码

这个代码利用了下面三个个系统调用

汇编如下

机器码如下


0 条评论
某人
表情
可输入 255