如何处理execve函数?
我正在编写此函数:如何处理execve函数?,c,pointers,execve,C,Pointers,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, &hack[1]); 而不是: 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, &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
将运行程序路径名,替换当前进程、堆栈帧和堆。为此,需要三个参数:
- 程序路径名的路径。这是一个基本的
,带有程序的路径字符*
- 传递给程序argv的参数。这与传递给您自己的
:获取命令行参数的main
的用法相同,第一个这样的参数是程序的argv
路径名
- 环境变量envp。这列出了程序执行上下文中存在的环境变量(例如$PATH,它列出了操作系统可以合理地找到可执行文件的所有路径)
char**
,这意味着它们是char*
(以null结尾的字符串)的列表,最后一个元素为null。
然后,程序可以期望迭代它们,直到找到一个空指针来收集其参数和环境
--
你的两种说法有两个不同之处:
- 在第一种情况下,指向
数组的指针,这意味着您有一个hack
,与需要一个字符***
的声明不兼容字符**
- 在第二种情况下,
数组本身是一个hack
(也称为字符串数组)char**
- 在第一种情况下,指向
数组的第二个元素的指针,它转换为“第一个元素为NULL的字符串数组”hack
- 在第二种情况下,NULL(在LINUX系统上为)的解释如上所述,但在大多数其他UNIX系统中会导致错误
execve(hack[0], hack, &hack[1]);
旁注:
char*hack[]代码>应该是char*hack[2]
(或者更好的是char*hack[]={/bin/sh”,NULL};
)。