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