gpt4 book ai didi

c - 为什么 execve 系统调用可以在没有任何 argv 参数的情况下运行 "/bin/sh"而不是 "/bin/ls"?

转载 作者:IT王子 更新时间:2023-10-29 00:06:36 32 4
gpt4 key购买 nike

我对 __NR_execve 的系统调用感到困惑。在我学习linux系统调用的时候。我知道使用 execve 的正确方法是这样的:

char *sc[2]; 
sc[0]="/bin/sh";
sc[1]= NULL;
execve(sc[0],sc,NULL);

然后函数 execve 将调用 syscall() 进入系统内核并将参数放入寄存器 EAX, EBX ECXEDX。但是,如果我使用它仍然会成功

execve("/bin/sh",NULL,NULL);

但是如果我将 "/bin/sh" 替换为 "/bin/ls",它会失败:

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

我想知道为什么"/bin/sh"在没有足够参数的情况下可以成功执行,而"/bin/ls"却失败了?

最佳答案

这不是内核问题。内核将使用 execvefilename arg 运行,无论 argvenvp 是否为 NULL 或不。 argv[0] 指向程序名只是 Unix 约定。

你看到的是正常的,即没有任何问题。因为 ls 是 GNU 的 coreutils 的一部分,coreutils 包中的所有程序都调用 set_program_name 来做一些设置工作。您可以在源代码中看到这一点:它检查 argv[0] 是否为 NULL,如果为 NULL,它将调用 abort

另一方面,/bin/sh 显然是一个不属于 coreutils 的程序,并且不检查 argv[0]。这就是它运行没有问题的原因。

引用源码:

关于c - 为什么 execve 系统调用可以在没有任何 argv 参数的情况下运行 "/bin/sh"而不是 "/bin/ls"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673765/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com