Execve() 添加了两个额外的参数
Execve() adds two extra arguments
当我编译以下代码并在其上 运行 strace
时,我可以看到它向 args[]
数组添加了两个额外的元素。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char *args[2];
args[0] = "/bin/ls";
args[1] = "-lh";
execve(args[0], args, NULL);
return 1;
}
strace
表示实际上是这样调用的:
execve("/bin/ls", ["/bin/ls", "-lh", "0117", ""], NULL)
您需要将空指针添加到参数数组的最后一个元素。否则 execve 不知道你的数组在哪里结束。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char *args[3];
args[0] = "/bin/ls";
args[1] = "-lh";
args[2] = NULL;
execve(args[0], args, NULL);
return 1;
}
所以基本上你看到的是 execv 传递随机参数,直到它在你用数组指向的内存中找到一个 NULL。当然它也可能崩溃。
当我编译以下代码并在其上 运行 strace
时,我可以看到它向 args[]
数组添加了两个额外的元素。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char *args[2];
args[0] = "/bin/ls";
args[1] = "-lh";
execve(args[0], args, NULL);
return 1;
}
strace
表示实际上是这样调用的:
execve("/bin/ls", ["/bin/ls", "-lh", "0117", ""], NULL)
您需要将空指针添加到参数数组的最后一个元素。否则 execve 不知道你的数组在哪里结束。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char *args[3];
args[0] = "/bin/ls";
args[1] = "-lh";
args[2] = NULL;
execve(args[0], args, NULL);
return 1;
}
所以基本上你看到的是 execv 传递随机参数,直到它在你用数组指向的内存中找到一个 NULL。当然它也可能崩溃。