问题标签 [execve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
675 浏览

c - Jprobe to 'do_execve' 在 Ubuntu 14 上不起作用,但在 Ubuntu 12 上工作

我正在尝试使用 Jprobes 在 Linux 内核上执行函数“do_execve()”的挂钩,但我遇到了某些系统的问题。我尝试使用我在 Ubuntu 12、64 位(内核版本 3.11)上在线找到的代码:

钩子.c:

生成文件:

该模块按预期工作。它首先在系统上正确编译,然后使用函数“insmod”(具有 ROOT 权限)插入。运行 dmesg 显示正确的输出:

当我在 Ubuntu 14、64 位(内核版本 3.13)系统上尝试相同的代码时出现问题。我在系统上重新编译它并像在以前的系统上一样插入它,但是这次它不起作用。我没有收到任何错误,并且打印了成功消息(“在 [ADDRESS WAS HERE] 处种植 jprobe,处理程序地址 [ADDRESS WAS HERE]”),但未打印“do_execve”行。我扫描了谷歌,但找不到解释或解决方案。有任何想法吗?

注意:我还尝试在 Ubuntu 14 上连接 'do_fork()' 并且成功了!这只是'do_execve()'的东西,我不知道是什么!

0 投票
1 回答
23575 浏览

c - 在 c 中使用 execve()

我需要看一个具体的例子,说明如何在 ac 程序中为 execve() 指定环境。在我的课堂上,我们正在编写一个程序,该程序将使用标准 LINUX 可执行文件和我们自己的可执行文件。因此,搜索 PATH 的环境必须包含两种可执行文件的标记。我找不到一个很好的例子来说明如何为 execve() 指定环境(第三个参数),因为每篇文章似乎都建议我们使用 execvp() 或 *clp() 或 *cl() 等来代替。

在我的项目中,我们必须使用 execve()。

现在,我只是想让 execve() 为基本的“ls”命令工作,以便以后可以让它为任何和所有可执行文件工作。

这是我的实验代码片段:

每次在我的 shell 中输入命令“1”时,我都会看到我的错误消息。我怀疑这是因为我声明 env_args[] 的方式。

有人可以向我展示如何使用指定的命令搜索环境实现 execve() 的一个很好的例子吗?

0 投票
2 回答
21967 浏览

c - C execve() 参数 [生成一个 shell 示例]

我必须填写以下参数:

如果我执行这个程序:

外壳按预期正确生成。

我的问题是,如果我像这样将 NULL 作为第二个参数传递,shell 也会正确生成:

那么使用 args 向量(带有“/bin/sh”+ NULL)作为第二个参数而不是 NULL 的目的是什么?

0 投票
2 回答
1935 浏览

linux - ARM,GNU 汇编器:如何将“数组”参数传递给 execve()?

我正在编写一个简单的 shellcode,它会调用execve()一个 ARM 平台(Raspberry PI 上的 Linux),并被execve. 根据文档

execve("/bin/sh", {NULL}, {NULL});如果我打电话(从组装的角度来看),这对我来说完全不合适:

上面的程序集编译得很好,并在我的测试机器上运行时调用了一个 shell,它具有 true /bin/sh。但是,我所有的麻烦是,在特定的目标框上本身并没有/bin/shbusybox,而只有一个符号链接,需要我执行类似execve("/bin/busybox", {"/bin/busybox", "sh", NULL}, {NULL}).

至于我的理解,数组在内存中是连续的,所以我要做的就是以连续的方式在内存中分配字节,然后将指针提供给我认为是这样的“数组”的开头。考虑到这一点,我尝试了以下操作:

但是没有成功。试图玩弄字节并创建一系列填充空字节以对齐到 4 个字节的字节,这也不起作用。如果.args标签看起来像这样:

那么strace正在执行的程序如下:

(尝试/bin/sh -c ls在编码之前先在测试机器上执行/bin/busybox sh)。

我运行了一个类似的 C 程序,然后对其进行调试以查看它是如何完成的。看起来传递给的位置r1包含一堆指向字符串的指针,然后自然是 0x00:

问题 既然我弄清楚了内存是如何布局的,那么如何在汇编中准备这样的布局并正确地将第二个参数传递给execve()ARM 汇编语言中的“数组”?

0 投票
0 回答
62 浏览

execve - 官方 CPE 词典中没有退出 CPE

在某些 CVE 中,我们可以读取一些CPE,例如:

cpe:/a:libcap:libcap:2.00

cpe:/a:gnome:libsoup:2.32.2

cpe:/a:libgtop:libgtop:2.14.5

但是 libcap、libsoup 和 libgtop 都没有在官方 CPE 字典中!

(XML 文件或在线搜索:https ://nvd.nist.gov/cpe.cfm )

怎么可能?

谢谢你,弗洛伦特

0 投票
2 回答
1247 浏览

c++ - 使用 C++ 动态执行和终止外部程序

我需要在控制每个进程的情况下执行进程。我想创建一个存储线程或 pid 或任何必要的类。

我目前有一个程序,它使用 C 函数 execvp 执行一个外部应用程序,并从 shell 脚本加载环境。所以我目前的程序是阻塞的。但我需要能够让它自由运行,并且只有在我终止当前运行或启动新的外部应用程序时。

我目前的方法是创建一个使用 execve 函数的线程。但是,据我所知,线程将被阻塞。

可能在线程中的代码(然后带有变量):

调用的应用程序可能在代码中不固定,它们的名称将由外部设置文件给出,包括参数。

现在我的实际问题是,有没有更好的方法来“管理”像 c++ 这样的外部应用程序?一些现成的解决方案(类,库)?如果不是,如果这是实际方式,我该如何终止线程。据说使用终止调用是不好的做法,这就是我经常阅读的内容。

我希望这对于论坛来说已经足够具体了,因为我不知道如何再具体了。如果您需要更多提示我想在这里创建什么,请随时在评论中提问。

更新

到 DBus 和其他:

附加信息 我没有写所有我想启动的进程!所以它将用于启动 3rd 方应用程序,即使我有代码,也不想更改。

0 投票
1 回答
109 浏览

c - 此代码第一次迭代后的意外输出

老实说,我不知道以下情况是如何发生的。这是代码:

read_command() 返回一个 char**,它基本上是输入字符串的“数组”,每个 char* 包含一个单词。就像我输入“hello people of earth”一样,结果将是 [“hello”、“people”、“of”、“earth”]。此功能始终有效。

在第一次迭代时,一切都按预期工作。例如,当我输入“日期”时,输出如下:

但是在第二次迭代中,如果我再次使用“日期”作为输入,则输出如下:

即使我打印像“hello”这样的常量字符串,第二个 printf 语句也总是在第一次迭代后打印“e”。然后参数 [0] 以某种方式在其中包含 2 个“日期”,即使命令指针只有 1 个“日期”。

在第三次迭代之后,程序不等待用户输入,它只是不停地循环并显示“PM:警告,进程表已满!”

什么可能导致这种情况?

我在 MINIX 3.1.0 中使用 C 的 cc 编译器工作

编辑:read_command():

0 投票
1 回答
604 浏览

linux - jprobe do_execve 不适用于内核 4.1

我想在 do_execve 上设置一个 jprobe 钩子来捕获每个执行的程序。

我的代码正在<= 3.2 linux内核(debian)上运行。这是我在 linux 内核 3.2 上的输出:

在 4.1 内核上,我得到相同的结果(所有内容都已注册),但没有“execve”:

这是我的代码:

当我在 kallsyms 上执行 grep 时,我得到了 3.2:

在 4.2 上:

我什至尝试将函数(因为 do_execve 原型已更改)更改为:

甚至没有帮助。

我可以在 do_fork 或 sys_open 等其他函数上设置挂钩,但不能在 do_execve 上设置。为什么?有人有想法吗?为什么它不再工作了?

编辑:

我也在挂钩 do_execveat:

0 投票
0 回答
19 浏览

linux - 使用系统调用跟踪器的特殊事件

我正在编写一个基本的系统调用跟踪器。它的基本操作是生成一个子进程,拦截它的系统调用,将它们计数,并在子进程关闭后将结果转储到文件中。

我正在使用常见的终端程序测试跟踪器。奇怪的是,有时它会在生成子进程后立即连续计算多个execve调用。例如,当我在ls上测试程序时,系统调用跟踪器在 ls 生成之后计数七个 execve。但是,当我在\bin\ls上测试系统调用跟踪器(没有其他更改)时,系统调用跟踪器将只计算一个 execve 调用,正如在上面的情况中应该有的那样。

为什么我得到不同的计数?shell 是否在拨打我不知道的电话?

0 投票
1 回答
306 浏览

c - 在 C 中实现管道

我在 C 中实现管道。当我尝试命令'cat aa | grep "something" ' 在我的程序中。grep 进程就挂在那里,似乎在等待输入。我不知道为什么。这里是核心代码。只需将 ExecuteCommand 视为简单地调用 execve 函数,并且所有参数都正确传递。

完整代码是开放的。另一个问题是我必须使用命令文件的完整路径作为 execve 的第一个参数(例如 /bin/ls 用于 ls),否则,我收到错误消息,不存在这样的文件。