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


25

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

Por exemplo, suas permissões podem ser r--r--r--apenas.

A execução de scripts é possível sem definir o bit de execução e colocar um shebang passando a fonte para o intérprete, por exemplo, bash script.shou python script.py.

Então, existe algo assim execute abinaryfileque carrega o código do objeto na memória e o executa?


3
fazer uma cópia e chmod uma opção?
TiCL

Não, estou me perguntando se existe uma maneira de executar um binário em um ambiente em que o bit de permissão não pode ser definido (no arquivo fornecido ou em qualquer cópia dele ...)
Tom

Respostas:


36

Você pode usar /lib/ld*.so como intérprete ELF, da seguinte maneira:

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

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


great info ..... enfim, o que significa ld?
Vineet Menon

@VineetMenon ldé o vinculador / carregador do programa. Ele localiza e carrega as bibliotecas compartilhadas usadas pelo programa e depois as executa. ld-linuxlida com binários ELF.
Daniel Beck

Ok, o que se /lib/ld-linux.so.2não é executável (que é mesmo possível?)
LawrenceC

@ultrasawblade AFAIK, apenas .sos executáveis podem ser carregados e isso ld-linuxé importante.
Daniel Beck

No Ubuntu de 64 bits é/lib64/ld-linux-x86-64.so.2
Tor Klingberg

1

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

O TiCL deve fazer da sua resposta uma resposta, porque é o melhor caminho a percorrer.


Sim, eu entendo "python" é um binário nesse caso. O que eu estava esperando é que o "algo compilação que pode carregar um arquivo e executá-lo" já existia ...
Tom

@ Tom Você encontrará programas em C que podem ler um binário na memória e executá-lo. Não sei se o Python é de nível baixo o suficiente para fazê-lo da maneira C, no entanto.
precisa saber é o seguinte

0

O execsyscall do kernel do Linux falha EACCESse o arquivo não for executável

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

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.shnão for executável, mainfalha com:

execve: Permission denied
13
13

Testado no Ubuntu 17.10 gcc -std=c99,.

O POSIX 7 menciona que em:

As funções exec, exceto fexecve (), falharão se:

[EACCES] A permissão de pesquisa é negada para um diretório listado no prefixo do caminho do novo arquivo de imagem de processo ou o novo arquivo de imagem de processo nega a permissão de execução.

Uma justificativa adicional pode ser encontrada em: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.