Puis-je exécuter un binaire Linux sans que le bit d'autorisation d'exécution soit défini?

25

Existe-t-il un moyen d'exécuter un fichier binaire exécutable sous Linux qui n'a pas le bit d'exécution défini? chmod +xn'est pas une option.

Par exemple, ses autorisations peuvent être r--r--r--uniquement.

L'exécution de scripts est possible sans définir le bit d'exécution et mettre un shebang en passant la source à l'interpréteur, par exemple bash script.shou python script.py.

Y a-t-il quelque chose comme execute abinaryfileça qui chargera le code objet en mémoire et l'exécutera?

À M
la source
3
faire une copie et chmod une option?
TiCL
Non, je me demande s'il existe un moyen d'exécuter un binaire dans un environnement où le bit d'autorisation ne peut pas être défini (sur le fichier donné ou sur des copies de celui-ci ...)
Tom

Réponses:

36

Vous pouvez utiliser /lib/ld*.so comme interpréteur ELF, comme ceci:

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

Le nom réel diffère d'une architecture à l'autre. Certains noms incluent /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2et /lib/ld-2.7.so. Vous pouvez probablement le trouver au singulier /lib/ld*.

Dolda2000
la source
grande info ..... de toute façon que signifie ld?
Vineet Menon
@VineetMenon ldest l'éditeur de liens / chargeur de programme. Il recherche et charge les bibliothèques partagées utilisées par le programme, puis l'exécute. ld-linuxgère les fichiers binaires ELF.
Daniel Beck
Ok, que se passe-t-il si /lib/ld-linux.so.2n'est pas exécutable (est-ce même possible?)
LawrenceC
@ultrasawblade AFAIK, seuls les exécutables .sopeuvent être chargés, et ld-linuxc'est assez important.
Daniel Beck
Sur Ubuntu 64 bits c'est/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

Non, du moins, pas de la même manière. Vous exécutez toujours un binaire lorsque vous faites la chose python. Python est + x. Vous auriez besoin de compiler quelque chose qui puisse charger un fichier et l'exécuter.

TiCL devrait faire de sa réponse une réponse car c'est la meilleure façon de procéder.

Paul
la source
Oui, je comprends que "python" est un binaire dans ce cas. Ce que j'espérais, c'est que "compiler quelque chose qui puisse charger un fichier et l'exécuter" existait déjà ...
Tom
@Tom Vous trouverez des programmes C qui peuvent lire un binaire en mémoire et l'exécuter. Je ne sais pas si Python est suffisamment bas pour le faire en C, cependant.
new123456
0

L' execappel système du noyau Linux échoue EACCESsi le fichier n'est pas exécutable

Bien que vous puissiez le faire sh myprog.sh, essayer d'exécuter le programme ./myprog.shne peut pas fonctionner, car lorsque vous faites cela:

Cela peut être vérifié avec 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);
}

et myprog.sh:

#!/bin/sh
echo worked

Si myprog.shn'est pas exécutable, mainéchoue avec:

execve: Permission denied
13
13

Testé dans Ubuntu 17.10, gcc -std=c99.

POSIX 7 mentionne que:

Les fonctions exec, à l'exception de fexecve (), échoueront si:

[EACCES] L'autorisation de recherche est refusée pour un répertoire répertorié dans le préfixe de chemin d'accès du nouveau fichier image de processus, ou le nouveau fichier image de processus refuse l'autorisation d'exécution.

Des explications supplémentaires peuvent être trouvées sur: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source