我在google上搜索发现Linux内核使用结构体来存储变量。
#define EMBEDDED_LEVELS 2
struct nameidata {
struct path path;
struct qstr last;
struct path root;
struct inode *inode; /* path.dentry.d_inode */
unsigned int flags;
unsigned seq, m_seq;
int last_type;
unsigned depth;
int total_link_count;
struct saved {
struct path link;
struct delayed_call done;
const char *name;
unsigned seq;
} *stack, internal[EMBEDDED_LEVELS];
struct filename *name;
struct nameidata *saved;
struct inode *link_inode;
unsigned root_seq;
int dfd;
} __randomize_layout;
例如对于execve
系统调用(在这里找到https://elixir.bootlin.com/linux/latest/source/fs/exec.c https://elixir.bootlin.com/linux/latest/source/fs/exec.c)
该函数将把文件名指针作为一个传递给另一个函数pathName并设置名称数据结构名称为此pathName
static int __do_execve_file(int fd, struct filename *filename,
struct user_arg_ptr argv,
struct user_arg_ptr envp,
int flags, struct file *file)
我的问题是如何计算从堆栈传递给该函数的参数的长度(例如"/bin/sh"
)?
(编者注:const char *pathname
arg to execve(2) http://man7.org/linux/man-pages/man2/execve.2.html不have指向堆栈内存。我认为这个问题假设 shellcode 用例是在用户空间堆栈上构造一个路径并传递一个指向该路径的指针。)
(我正在学习汇编,我陷入了系统调用的参数传递部分)