orw
execve
→execveat
open
→openat
,注意glibc中的open
wrapper使用的是openat
,如果是open
白名单则需要手动拼syscall
read
→readv, pread64, preadv, preadv2
, write
→writev, 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在老版本的linux上能绕过seccomp