如何解决如何处理execve函数?
我正在编写这个函数:
int main(int argc,char const *argv[]) {
char* hack[];
hack[0] = "/bin/sh";
hack[1] = NULL;
execve(hack[0],&hack,&hack[1]);
return 0;
}
我的问题是,写这行有什么区别:
execve(hack[0],&hack[1]);
代替:
execve(hack[0],hack,NULL);
如果有什么区别,哪个是最好的方法?编写第一种表达式时,我收到一条警告:
warning: passing argument 2 of ‘execve’ from incompatible pointer type [-Wincompatible-pointer-types]
note: expected ‘char * const*’ but argument is of type ‘char * (*)[3]’
这是什么意思?
解决方法
编辑:我将从关于 execve
的解释开始,使其更清楚一些。
execve
将运行程序 pathname,替换当前进程、栈帧和堆。为此,它需要三个参数:
- 程序的路径路径名。这是包含程序路径的基本
char*
。 - 传递给程序的参数argv。这与传递给您自己的
argv
的main
用途相同:获取命令行参数,第一个此类参数是程序的pathname
。 - 环境变量envp。这列出了程序执行上下文中存在的环境变量(例如 $PATH 列出了操作系统可以合理地找到可执行文件的所有路径)。
argv 和 envp 都是 char **
,这意味着它们是 char *
(空终止字符串)的列表,最后一个元素是无效的。
然后程序可以期望迭代它们,直到它们找到一个 NULL 指针来收集它的参数和环境。
--
您的两个陈述之间有两个不同之处:
-
第二个参数(argv):
- 在第一种情况下,一个指向
hack
数组的指针,意味着您有一个char***
,与期望char**
- 在第二种情况下,
hack
数组本身,它是一个char **
(也称为字符串数组)
- 在第一种情况下,一个指向
-
第三个参数(envp):
- 在第一种情况下,指向
hack
数组的第二个元素的指针,转换为“第一个元素为 NULL 的字符串数组”。 - 在第二种情况下,NULL,它在 LINUX 系统上解释如上,但在大多数其他 UNIX 系统中会导致错误。
- 在第一种情况下,指向
引用 execve(2) 手册页:
在 Linux 上,argv 和 envp 可以指定为 NULL。在这两种情况下, 这与将参数指定为指针具有相同的效果 到包含单个空指针的列表。 不要拿 这种非标准且不可移植的错误功能的优势! 许多其他 UNIX 系统,将 argv 指定为 NULL 将导致 错误(EFAULT)。其他一些 UNIX 系统将 envp==NULL 情况与Linux相同。
总而言之,就您而言,正确的调用是
execve(hack[0],hack,&hack[1]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。