Posso executar um processo inteiramente novo sem um arquivo executável?

5

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.

    
por Ruslan 18.09.2015 / 07:33

2 respostas

2

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);
    
por 03.09.2018 / 21:50
1

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.

    
por 18.09.2015 / 19:01