使用命令行参数执行位于内存中的程序

时间:2018-12-03 18:50:01

标签: c linux memory

我有一个叫做的静态编译程序(例如'busybox')。 Busybox(或另一个文件)不需要任何库文件。因此,从理论上讲,这意味着我可以使用linux内核在任何地方运行busybox(在运行时没有glibc文件或其他库文件)。 现在,我的计划是在没有库或任何资源的目录中的监狱(chroot)中运行busybox,这是可能的,因为'busybox'是静态编译的。 (我是root用户,或者具有root用户访问权限)我的想法也是做一个门(例如访问可执行文件或内存中加载的可执行文件的内存I / O地址)。首先,我创建程序开始的门(内存地址)(子进程可以使用的共享内存地址)。从busybox可执行文件加载。我也使用mprotect来使文件可执行,然后在fork()中运行C,该子进程运行chroot也会更改根目录并监禁自己。为了安全起见,他将用户更改为没有sudo访问权限的非root用户,并可以使用setuidsetgid访问目录。然后,程序使用父级提供的参数在内存中运行加载的程序。 (监禁busybox的监牢也是静态编译的)

是的,可以从内存中运行可执行文件:

How can i execute an executable from memory?

唯一的问题是,如何使用命令行参数运行该内存可执行文件?

1 个答案:

答案 0 :(得分:0)

  

如何使用命令行参数运行该内存可执行文件?

所有程序均以int main(int argc, char *argv[])(或int main(int argc, char *argv[], char *env[]))(或实现定义的main)开头。只需使用适当的函数指针类型调用内存并为其填充参数,就像shell或system命令一样。

int main() {
   // blablabla fork + mprotect + chroot + setuid + setgid
   const char memory[] = "this is the source for your statically compiled program";
   int (*memory_main(int argc, char *argv[])) = (void*)memory;
   int argc = 3;
   char argv_0[] = "memory_main";
   char argv_1[] = "first arg";
   char argv_2[] = "second arg";
   char *argc[] = { argv_0, argv_1, argv_2, NULL };
   return memory_main(argv, argc);
}