微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理execve函数?

如何解决如何处理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。这与传递给您自己的 argvmain 用途相同:获取命令行参数,第一个此类参数是程序的 pathname
  • 环境变量envp。这列出了程序执行上下文中存在的环境变量(例如 $PATH 列出了操作系统可以合理地找到可执行文件的所有路径)。

argvenvp 都是 char **,这意味着它们是 char *(空终止字符串)的列表,最后一个元素是无效的。 然后程序可以期望迭代它们,直到它们找到一个 NULL 指针来收集它的参数和环境。

--

您的两个陈述之间有两个不同之处:

  1. 第二个参数(argv):

    • 在第一种情况下,一个指向 hack 数组的指针,意味着您有一个 char***,与期望 char**
    • 在第二种情况下,hack 数组本身,它是一个 char **(也称为字符串数组)
  2. 第三个参数(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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?