Posso executar um binário do Linux sem que o bit de permissão de execução seja definido?

24

Existe uma maneira de executar um arquivo binário executável no Linux que não tenha o bit de execução definido? chmod +x não é uma opção.

Por exemplo as permissões podem ser apenas r--r--r-- .

A execuo de scripts possel sem definir o bit de execuo e colocar um shebang passando a fonte para o intprete, e. bash script.sh ou python script.py .

Então, há algo como execute abinaryfile que carregará o código do objeto na memória e o executará?

    
por Tom 30.09.2011 / 01:29

3 respostas

33

Você pode usar /lib/ld*.so como um interpretador ELF, assim:

$ cp /bin/ls /tmp/ls
$ chmod a-x /tmp/ls
$ /lib/ld-linux.so.2 /tmp/ls

O nome real difere da arquitetura para a arquitetura. Alguns nomes incluem /lib/ld-linux.so.2 , /lib/ld-linux-x86-64.so.2 e /lib/ld-2.7.so . Você provavelmente pode encontrá-lo singularmente como /lib/ld* .

    
por 30.09.2011 / 03:51
1

Não. Pelo menos não da mesma maneira. Você ainda está executando um binário quando faz a coisa do python. Python é + x. Você precisaria compilar algo que possa carregar um arquivo e executá-lo.

O TiCL deve tornar sua resposta uma resposta, porque é o melhor caminho a seguir.

    
por 30.09.2011 / 01:59
0

O exec syscall do kernel do Linux falha com EACCES se o arquivo não for executável

Enquanto você pode fazer sh myprog.sh , tentando executar o programa como ./myprog.sh não pode funcionar, desde quando você faz isso:

  • Bash usa a chamada do sistema exec em ./myprog.sh
  • os shebangs são interpretados diretamente pela chamada de sistema exec do kernel do Linux, conforme explicado em: link
  • o kernel do Linux se recusa a executar arquivos sem permissão executável

Isso pode ser verificado com main.c :

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

e myprog.sh :

#!/bin/sh
echo worked

Se myprog.sh não for executável, main falhará com:

execve: Permission denied
13
13

Testado no Ubuntu 17.10, gcc -std=c99 .

POSIX 7 menciona que em:

The exec functions, except for fexecve(), shall fail if:

[EACCES] Search permission is denied for a directory listed in the new process image file's path prefix, or the new process image file denies execution permission.

Outras razões podem ser encontradas em: link

    
por 28.03.2018 / 16:48

Tags