禁execve

orw

使用未限制函数

execveexecveat

openopenat ,注意glibc中的open wrapper使用的是openat,如果是open白名单则需要手动拼syscall

readreadv, pread64, preadv, preadv2writewritev, pwrite64, pwritev, pwritev2

未限制A < 0x40000000

使用x32 ABI,将x86_64下的syscall number直接|= 0x40000000

或者使用x32 ABI compat,将以下syscall number|= 0x40000000(仅部分syscall,且需要内核编译config CONFIG_X86_X32=y

https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl#L377-L419

未限制A == ARCH_X86_64

例子:2022 研究生赛初赛made_in_heaven,不允许open/openat,但未限制架构

使用retfq 0x23切换到32位模式,执行32位shellcode

切换前可以考虑先mmap一个rwx段,且地址高32bit为0,用于存放32位的shellcode

若在32位下需要使用栈,也记得将rsp迁移到高32bit为0的地址

切换shellcode:

; to 32bit
push 0x23
push 0x19260400 ; 32bit shellcode addr
retfq

未限制ptrace(before kernel 4.8)

ptrace在老版本的linux上能绕过seccomp