问题标签 [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 投票
2 回答
27386 浏览

c - execve - 没有这样的文件或目录?

我遇到了一些关于 execve 的问题。我正在尝试制作一个可以像 bash shell 一样运行的 shell,但是我在分叉子执行命令时遇到了问题。这是我为孩子准备的。cmd 是带有用户输入的命令的字符 *。但是,当我运行此程序时,我从 perror 收到此错误:

我用一个简单的 ls 尝试了该程序,它应该使 path="/bin/ls" 并执行它(我已经确认这是我的 ls 命令所在的位置)但它仍然抱怨。我究竟做错了什么?谢谢!

0 投票
3 回答
1720 浏览

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

我正在尝试使用 ubuntu 12 上的终端进行编译:

我在http://www.securitytube.net/video/235上找到了这个例子,它也恰好是 Aleph One 在“为了乐趣和利润而粉碎堆栈”中使用的一个。我知道从那以后发生了很大的变化。在我使用的更简单的示例中:

gcc -ggdb -mpreferred-stack-boundary=2 -fno-stack-protector 文件名 filename.c

其他时候我可能会包含静态实用程序。在我尝试编译上面的 C 代码之前,它一直有效。我从终端收到的消息是:

我知道这是一个非常简单的示例,并且此错误可能是由 linux 中当前的标准安全措施引起的,但我想绕过它们来练习这个示例以及将来的更多内容。如果有人可以提供帮助,那将是“粉碎”。

干杯

0 投票
1 回答
487 浏览

android - 在Linux中使用“execve”运行android模拟器的进程,但是“avd”路径不对?

我遇到了一个关于运行 android 模拟器的问题,下面是详细信息。非常感谢!

我需要自动运行android模拟器,所以倾向于execve在Linux中使用,源代码如下所示:

控制台显示:PANIC: Could not open: /tmp/.android/avd/new1.ini

默认情况下,我的 avd 存储路径是~/.android/avd。但是新进程只能找到根文件系统的路径来读取可移植性不好的avd文件。实际上模拟器的过程已经运行。我专注于设置环境变量,但失败了。

请问我应该如何设置我的环境变量?

0 投票
1 回答
886 浏览

c - Linux下共享内存映射

动机

我想编写一对程序,其中一个程序读取数据并将其转换为内部格式,另一个程序将内部格式转换为其他格式。作为练习,我想在不使用管道的情况下编写这些程序之间的交互。我更喜欢使用信号和共享内存。

我想要的是

我有 A 调用 B 的程序 A 和 B。我该怎么做

  1. 从程序 A 创建一个内存块
  2. 从程序 A 调用程序 B,给它关于在哪里找到内存块的信息
  3. 使用两个程序中的内存块。

更具体地说,A 解码自定义视频格式并将单个未压缩帧放入共享缓冲区。B 从缓冲区中读取数据并将其编码为输出流。解码器每秒解码高达 100 帧,这大约是 500 MiB/s 的内存流量。管道变得很慢,因为必须经常复制数据并且缓冲区不是很大。

我认为可能有效

我的想法是用来mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)创建一段共享内存。问题是,execve(2)状态手册页:

不保留内存映射 (mmap(2))。

那么,我怎样才能与其他程序共享该内存呢?将这两种功能都放在一个程序中并改用是更好的主意fork吗?

0 投票
2 回答
2675 浏览

c - C 和 execve(3) 参数

我正在做一个与strace(1)使用ptrace(). 基本上,我们有一个 controller.c 程序,它接受一个可执行文件作为参数,它输出可执行文件所做的任何系统调用(例如% controller ls -l)我们正在使用execve()来运行可执行文件,但是我们遇到了一些麻烦。execve 采用以下参数

其中 filename 在这种情况下是"ls", 并且argv[]是给定文件名的参数列表。所以我们有一些看起来像这样的东西(在 C 文件中)

因此,如果我们得到一个可执行文件,例如controller ls -lwhere argv[0] = "controller"argv[1] = "ls"argv[2] = "-l",我们如何在“ARGUMENT LIST”中传递正确的参数(这种情况下的参数只是"-l"但可能更多)?

基本上,我们如何初始化一个类型的数组,以const char *使该数组具有可执行文件的参数值?我们是否甚至需要担心数组中有额外的值并且只是过去argv的 ARGUMENT LIST?

谢谢你的帮助!

0 投票
2 回答
521 浏览

linux - fork 后的 Linux 用户空间 ELF 加载程序极其奇怪的行为

考虑以下代码(由于公众需求重新编译:):

a.out 程序是一个简单的 main() { return 0; } 程序。

如果您编译并运行此代码,您将看到子进程尝试 mmap()fopen("log") 调用打开的文件。您将通过失败的断言看到这一点。

我进一步研究并发现这发生在加载子进程期间。

这很奇怪,原因有两个:

  1. 孩子根本不应该知道 fopen() 调用,因为它发生在 fork() 之后
  2. 为什么加载程序会尝试映射此文件?它甚至不是可执行文件。

我在 glibc 中查看了 dl-load.c ,但没有看到任何应该调用这种行为的东西。

有任何想法吗?

谢谢

0 投票
1 回答
211 浏览

c - C:用参数声明函数会改变它的行为......?

我正在玩信号、fork 和 execve,并且我编写了一个玩具程序,用于fork()创建一个调用另一个玩具程序的子进程。然后父级设置警报以在一定秒数后终止该功能。

这是奇怪的部分:如果我声明该函数forkyMcFork()不带参数,然后alarm()手动设置参数,那么它就像我期望的那样工作:子进程启动problem5,它要求用户输入一些输入,然后在 3秒,killhandler运行,找到子进程并杀死它:

但是,如果我改为声明forkyMcFork(int secs)然后使用,则找不到alarm(secs)应该由子程序中的语句调用的外部程序。execve()警报按预期运行,因此在几秒钟后,子进程被取消。

这是非工作代码:

这是它的输出:

所以要清楚,这里唯一的代码区别是是否forkyMcFork声明为 take void,在这种情况下它有效,或者 astaking int secs,在这种情况下它不。这是怎么回事?

0 投票
1 回答
368 浏览

linux-kernel - ptregs_execve 和 sys_execve 之间有什么区别/关系

我在 Linux 2.6.32 x86-32 上挂接系统调用。

但是,我发现在系统调用表中__NR_execve是指向ptregs_execve而不是sys_execve。而且,我找不到ptregs_execve任何地方的函数定义。

谁能帮我澄清ptregs_execve和 sys_execve 之间的区别或关系?我知道对于um架构,ptregs_execve定义为sys_execve. 其他架构呢?

0 投票
1 回答
2468 浏览

assembly - execve shellcode 写入分段错误

我正在尝试研究 execve shellcode,

操作系统:Linux bt 2.6.39.4

root@bt:~/exploit# cat gshell.s

root@bt:~/exploit# as -gstabs -o gshell.o gshell.s

root@bt:~/exploit# ld -o gshell gshell.o

root@bt:~/exploit# ./gshell 分段错误(核心转储) root@bt:~/exploit#

广发银行:

(gdb) break *_start Breakpoint 1 at 0x8048054: 文件 gshell.s,第 6 行。

(gdb) r 启动程序:/root/exploit/gshell

程序收到信号 SIGSEGV,分段错误。shell () at gshell.s:14 14 movb %al,9(%esi)

(gdb) 打印 /x $esi $1 = 0x804807a (gdb) x/16cb $esi 0x804807a : 47 '/' 98 'b' 105 'i' 110 'n' 47 '/' 98 'b' 97 'a' 115 's' 0x8048082 : 104 'h' 65 'A' 68 'D' 68 'D' 68 'D' 68 'D' 67 'C' 67 'C' (gdb)

从上面的输出看来我已经成功地将 /bin/sh 地址放入 ESI 寄存器但是当我尝试将 0 移动到 9(%esi) --> 它会导致分段错误。甚至试图修改这个程序:movl $0 to $esi。想知道是否限制在 0x804807a 地址写入?哪个导致这个故障?以及如何继续成功运行这个 shellcode

谢谢,小杰克

0 投票
1 回答
906 浏览

x86 - exec() 系统调用参数使用的寄存器

我想知道 exec() 系统调用参数存储在哪些寄存器中。

我首先运行了一个简单的 C 程序,它执行 exec 系统调用并获取其对象转储,发现 RDI 被用于包含要执行的进程的参数,并且 syscall 指令被用于在内核中调用 execve。我是在 64 位 Ubuntu 12.04 操作系统中完成的

然后我在 QEMU 上运行的 Ubuntu 11.10 OS(32 位)上运行了这个程序。但是现在在没有 0x80 的对象转储中断中被使用并且参数在 EBX 中。

我在两个方面感到困惑..为什么在一个地方使用 int80 而在另一个地方使用 syscall 以及如何选择 execve 系统调用的寄存器?