【问题标题】:Can't execute system call "execve"无法执行系统调用“execve”
【发布时间】:2014-04-29 22:50:31
【问题描述】:

我是新手,所以我的表达方式可能不准确。我需要使用汇编程序在 C 中进行系统调用“execve”。我不使用任何库。不工作的部分是

char *nul=(char *)0;
char *argv[] = { "/bin/date", nul };
char *envp[] = { nul };
long ret;
asm volatile ("int $0x80" : "=a" (ret) : "a" (11), "b" (argv[0]), "c" (argv), "d" (envp));
//"a" (11) ... 11 correspondes to execve

我用

编译代码(既没有错误也没有警告)
gcc -m32 -nostdlib -nostdinc -static -O2 sysc.c -o sysc

当我尝试运行程序时,我看到这条消息:

A NULL argv[0] was passed through an exec system call.
Aborted

【问题讨论】:

  • 您是否尝试通过 ecx 传递 &argv
  • 为什么需要使用汇编程序从 C 程序调用 C 函数? (我并不是说没有可能的原因,但知道你的目标可能有助于回答这个问题。)
  • c 也应该是 argv[0]。指向数组的指针在 C 中非常罕见且无用;通常你总是对指向第一个元素的指针进行操作。
  • @ccKep 我做了,没有帮助。
  • @KerrekSB 不,也不起作用

标签: c arrays assembly execve


【解决方案1】:

如果您查看生成的代码,您会发现编译器优化了 argvenvp 的初始化,假设您的 asm 块没有访问它们(因为您只声明您需要指针本身)。

解决方案:添加一个"memory" clobber 告诉编译器您可以读取或写入任何内存。

【讨论】:

    【解决方案2】:

    exec() 系列函数的参数有点奇怪。

    特别是,arg0 和 arg1 大致相同:

    char *args [] = {"./path/to/program", "arg1", "arg2", NULL};
    
    int rc = execve (args[0], args, envp);
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2019-10-01
      • 1970-01-01
      • 2015-03-23
      • 2012-09-23
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      相关资源
      最近更新 更多