Kann ich eine Linux-Binärdatei ausführen, ohne dass das Ausführungsberechtigungsbit gesetzt ist?

25

Gibt es eine Möglichkeit, eine ausführbare Binärdatei unter Linux auszuführen, für die das Ausführungsbit nicht gesetzt ist? chmod +xist keine Option.

ZB können es r--r--r--nur Berechtigungen sein .

Das Ausführen von Skripten ist möglich, ohne das Ausführungsbit zu setzen und einen Shebang einzugeben, indem die Quelle an den Interpreter übergeben wird, z . B. bash script.shoder python script.py.

Gibt es also so etwas, execute abinaryfiledass der Objektcode in den Speicher geladen und ausgeführt wird?

Tom
quelle
3
eine Kopie machen und eine Option chmod?
29.
Nein, ich frage mich, ob es eine Möglichkeit gibt, eine Binärdatei in einer Umgebung auszuführen, in der das Berechtigungsbit nicht gesetzt werden kann (für die angegebene Datei oder Kopien davon ...)
Tom

Antworten:

36

Sie können /lib/ld*.so wie folgt als ELF-Interpreter verwenden:

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

Der tatsächliche Name unterscheidet sich von Architektur zu Architektur. Einige Namen sind /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2und /lib/ld-2.7.so. Sie können es wahrscheinlich als einzigartig finden /lib/ld*.

Dolda2000
quelle
tolle info ..... sowieso wofür steht ld?
Vineet Menon
@VineetMenon ldist der Programm-Linker / Loader. Es findet und lädt die gemeinsam genutzten Bibliotheken, die vom Programm verwendet werden, und führt sie dann aus. ld-linuxbehandelt ELF-Binärdateien.
Daniel Beck
Ok, was /lib/ld-linux.so.2ist , wenn es nicht ausführbar ist (ist das überhaupt möglich?)
LawrenceC
@ultrasawblade AFAIK, nur ausführbare .sos können geladen werden, und ld-linuxist irgendwie wichtig.
Daniel Beck
Auf 64-Bit-Ubuntu ist es/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

Zumindest nicht auf die gleiche Weise. Sie führen immer noch eine Binärdatei aus, wenn Sie die Python-Sache machen. Python ist + x. Sie müssten etwas kompilieren, das eine Datei laden und ausführen kann.

TiCL sollte seine / ihre Antwort als Antwort geben, da dies der beste Weg ist.

Paul
quelle
Ja, ich verstehe, dass "Python" in diesem Fall eine Binärdatei ist. Ich hatte gehofft, dass das "Kompilieren einer Datei, die geladen und ausgeführt werden kann" bereits existierte ...
Tom
@Tom Hier finden Sie C-Programme, die eine Binärdatei in den Speicher lesen und ausführen können. Ich weiß nicht, ob Python niedrig genug ist, um es auf C-Art zu tun.
new123456
0

Der execSystemaufruf des Linux-Kernels schlägt fehl, EACCESwenn die Datei nicht ausführbar ist

Während Sie dies tun können sh myprog.sh, kann der Versuch, das Programm auszuführen, ./myprog.shnicht funktionieren.

Dies kann überprüft werden mit 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);
}

und myprog.sh:

#!/bin/sh
echo worked

Wenn myprog.shnicht ausführbar, mainschlägt fehl mit:

execve: Permission denied
13
13

Getestet in Ubuntu 17.10 gcc -std=c99.

POSIX 7 erwähnt, dass bei:

Die exec-Funktionen mit Ausnahme von fexecve () schlagen fehl, wenn:

[EACCES] Die Suchberechtigung wird für ein Verzeichnis verweigert, das im Pfadpräfix der neuen Prozessabbilddatei aufgeführt ist, oder die neue Prozessabbilddatei verweigert die Ausführungsberechtigung.

Weitere Gründe finden Sie unter: /security/66550/unix-execute-permission-can-easly-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli ist ein Schauspieler
quelle