Sim, através de memfd_create
e fexecve
:
int fd = memfd_create("foo", MFD_CLOEXEC);
// write your image to fd however you want
fexecve(fd, argv, envp);
Suponha que meu aplicativo de 32 bits não raiz seja executado em um sistema de 64 bits, todos os sistemas de arquivos que são montados como somente leitura. O aplicativo cria uma imagem de um ELF de 64 bits na memória. Mas, devido a sistemas de arquivos somente para leitura, não é possível despejar essa imagem em um arquivo para fazer um execve
on. Ainda há uma maneira compatível de iniciar um processo a partir dessa imagem?
Nota: o principal problema aqui é mudar do modo de 32 bits para o de 64 bits, não fazendo nenhum hacks potencialmente não confiáveis . Se isso for resolvido, a questão toda se tornará trivial - basta criar um utilitário de carga personalizado.
Sim, através de memfd_create
e fexecve
:
int fd = memfd_create("foo", MFD_CLOEXEC);
// write your image to fd however you want
fexecve(fd, argv, envp);
Você está procurando por algo como "userland exec". Implementação aqui . Basicamente, isso envolve carregar algum código independente de posição que não tenha referências externas na memória e marcá-lo como executável. Esse código independente de posição remove o executável anteriormente executado e é recarregado. Parece que você pode ter que modificar o userland exec eu escrevi pelo menos um pouco.