Tag: execve

Shellcode:执行2次execve()调用

我试图在汇编中编写shellcode。 我需要执行/usr/bin/killall命令和/usr/bin/wget命令。 我有两个命令在shellcode中使用execve()系统调用完美运行。 但是现在我想要将这两个结合起来,但这是不可能的,因为程序在执行第一个execve()调用时退出。 (来自execve()的手册页: execve()在成功时不返回)。 如何执行2次execve()调用? 或者是否有另一种方法可以从同一个shell代码中调用/usr/bin/killall和/usr/bin/wget ? 提前致谢并表示感谢!

如何从终端编译这个简单的shellcode c程序?

我试图使用ubuntu 12上的终端编译它: #include #include main() { /*declare argument array*/ char *args[2]; args[0] = “/bin/bash”; args[1] = NULL; execve(args[0], args, NULL); exit(0); } 我在http://www.securitytube.net/video/235上找到了这个例子,这也恰好是’Smashing the Stack for Fun and Profit’中使用的一个Aleph One。 我知道自那以后发生了很多变化。 在我使用的更简单的例子中: gcc -ggdb -mpreferred-stack-boundary = 2 -fno-stack-protector filename filename.c 其他时候我可能包括静态实用程序。 它一直在努力,直到我试图编译上面的C代码。 我从终端收到的消息是: ss@ss-laptop:~$ gcc -static -mpreferred-stack-boundary=2 -fno-stack-protector -o shell shell.c shell.c: In function ‘main’: […]

用路径搜索执行?

我想从我的代码中执行一个程序,并为它提供环境变量和参数。 AFAICT, execve是正确的选择。 但是, execve接收path参数,而不是filename ,这意味着它期望第一个参数是可执行文件的路径。 我知道我可以自己解析$PATH找到路径,但实际上,没有其他选择吗? 没有其他人在某处实现它供我使用吗?

C – 通过管道传递管道

我正在为学校做一个项目,我不确定我试图解决它的方式是否可行。 该项目涉及制作一个程序,分离2个孩子,然后必须用其他程序替换他们的pid,并让2个孩子通过使用read()和write()通过管道进行交谈。 我的问题是使用execve并将管道传递给那个孩子。 我现在拥有的是: 家长计划 – 分叉和让孩子打电话: #include #include #include #include #include #include #define BUF_SIZE 16 /* 2 cmd line arguments 1. file already in system (to be copied) 2. file to be created (the copy) create pipe (for communication) + 2 child processes first child replace pid with reader second child with writer wait […]

execve(“/ bin / sh”,0,0); 在管道里

我有以下示例程序: #include int main(int argc, char ** argv){ char buf[100]; printf(“Please enter your name: “); fflush(stdout); gets(buf); printf(“Hello \”%s\”\n”, buf); execve(“/bin/sh”, 0, 0); } 我和我在没有任何管道的情况下运行它应该工作并返回一个sh promt: bash$ ./a.out Please enter your name: warning: this program uses gets() which is unsafe. testName Hello “testName” $ exit bash$ 但这不适用于管道,我想我知道为什么会这样,但我无法找到解决方案。 示例运行波纹管。 bash$ echo -e “testName\npwd” | ./a.out Please […]

了解执行和设置环境变量的要求

我们在解释老师方面遇到了很多麻烦。 我们要求澄清并从他那里得到以下回复 对于execve,使用导出的变量向它发送一个环境,并创建一个内置命令来生成/ bin / bash的子shell,这样你就可以使用env查看导出的变量。 (他在谈论在这里创建我们自己的环境变量。) 是创建自己的。 您可以在shell启动时复制environ并仅添加导出的变量 这与我在Stack Overflow上的以下post有关(阅读这篇文章将帮助您理解我想要做的事情): 使用execve的新路径运行ls命令 我们对此非常困惑。 我将再一次解释我们现在要做的事情。 类似于Linux shell的工作方式,我们需要编写自己的程序,可以设置环境变量,如PATH和USER以及用户想要定义的其他任何变量。 你将如何调用它的一个例子是(在你的程序中提示): mysetenv dog spike 这将创建一个看起来像“dog = spike”的环境变量 更重要的是,我们需要能够设置自己的PATH变量并将其发送到exec命令。 这是令人困惑的部分,因为基于我们所有的问题,我们不明白我们应该做什么。

传递文件描述符 – 执行(类型转换)

我想知道如何通过execve命令传递文件描述符,然后在另一端访问它。 我知道我可以使用dup2重定向文件描述符,但我不能这样做。 我需要实际将文件描述符传递给子进程并在子进程中使用它。 到目前为止我所拥有的: Parent使管道+ args如下: int pfd[2]; if(pipe(pfd) == -1) exitWithError(“PIPE FAILED”, 1); char *args_1[] = {“reader”, argv[1], (char*) pfd, (char *) 0}; 然后孩子像叉子一样调用execve: close(pfd[1]); execve(“./reader”, args_1, NULL); 然后,在读者程序中,我尝试访问传递的管道描述符: int main(int argc, char* argv[]){ … write(argv[2][1], buf, read_test); ^^ argv [2]应该引用管道描述符,然后[1]应该转到管道的写端。 我几乎肯定我需要在这里做一些不同的类型转换,但我尝试的一切都不太合适。 – 注意::我有一个这个程序的工作版本,使用dup2重定向到孩子的stdin和stdout,但是我必须按照项目的指示将管道描述符传递给子节点。 任何帮助表示赞赏。

C execve()参数

我必须填写以下参数: int execve(const char *filename, char *const argv[], char *const envp[]); 如果我执行这个程序: #include int main() { char *args[2]; args[0] = “/bin/sh”; args[1] = NULL; execve(args[0], args, NULL); } shell按预期正确生成。 我的问题是,如果我将NULL作为第二个参数传递,那么shell也会正确生成: #include int main() { char *args[2]; args[0] = “/bin/sh”; args[1] = NULL; execve(args[0], NULL, NULL); } 那么使用args向量(使用“/ bin / sh”+ NULL)作为第二个参数而不是NULL的目的是什么?

使用execve的新路径运行ls命令

我试图使用execve来运行ls命令。 目前我正在使用以下参数运行它: execve(args[0], args, env_args) //args looks like {“ls”, “-l”, “-a”, NULL} //env_args looks like {“PATH=/bin”, “USER=me”, NULL} 我期望这样做是使用我的新env_args运行ls命令,这意味着它将在我的PATH中查找ls。 但是,这段代码实际上没有做任何事情,当我运行代码时它只返回我的命令提示符而没有输出。 使用相同的args []我使用execvp并且工作并搜索我当前的路径。 你能告诉我我做错了什么吗? 我想要做的是编写我自己的shell程序,在那里我可以创建和导出我自己的环境,并让exec使用我在char **中定义的环境。 本质上我正在编写自己的函数来操作env_args来添加和删除变量,当我调用exec时我希望能够在{“ls”,“ – l”,NULL}上调用exec并让它看不起我的新环境名为ls的有效程序的路径变量。 我希望这能解释我做得更好。 在这种情况下,我不认为extern environ var对我有用。