Czy mogę wykonać plik binarny systemu Linux bez ustawionego bitu uprawnień do wykonywania?

25

Czy istnieje sposób na uruchomienie wykonywalnego pliku binarnego pod Linuksem, który nie ma ustawionego bitu wykonania? chmod +xnie jest opcją.

Np. Uprawnienia mogą być r--r--r--tylko.

Wykonywanie skryptów jest możliwe bez ustawiania bitu wykonania i wstawiania shebang poprzez przekazanie źródła do tłumacza, np . bash script.shLub python script.py.

Czy jest coś takiego execute abinaryfile, który załaduje kod obiektu do pamięci i uruchomi go?

Tomek
źródło
3
zrobić kopię i chmod opcją?
TiCL
Nie, zastanawiam się, czy istnieje sposób na wykonanie pliku binarnego w środowisku, w którym nie można ustawić bitu uprawnień (dla danego pliku lub jego kopii ...)
Tom

Odpowiedzi:

36

Możesz użyć /lib/ld*.so jako interpretera ELF, np .:

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

Rzeczywista nazwa różni się w zależności od architektury. Niektóre nazwy należą /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2i /lib/ld-2.7.so. Prawdopodobnie można go znaleźć osobno jako /lib/ld*.

Dolda2000
źródło
świetna informacja ... tak czy inaczej, co oznacza ld?
Vineet Menon,
@VineetMenon ldto program do łączenia / ładowania programów. Wyszukuje i ładuje biblioteki współdzielone używane przez program, a następnie wykonuje je. ld-linuxobsługuje pliki binarne ELF.
Daniel Beck
Ok, co jeśli /lib/ld-linux.so.2nie jest wykonywalny (czy to w ogóle możliwe?)
LawrenceC
@ultrasawblade AFAIK, .somożna załadować tylko pliki wykonywalne i ld-linuxjest to trochę ważne.
Daniel Beck
W 64-bitowym systemie Ubuntu jest to/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

Nie. Przynajmniej nie w ten sam sposób. Nadal wykonujesz plik binarny, kiedy wykonujesz zadanie w Pythonie. Python to + x. Musisz skompilować coś, co może załadować plik i wykonać go.

TiCL powinien udzielić odpowiedzi, ponieważ jest to najlepsza droga.

Paweł
źródło
Tak, rozumiem, że w tym przypadku „python” jest plikiem binarnym. Miałem nadzieję, że „kompilacja czegoś, co może załadować plik i wykonać go” już istniała…
Tom
@ Tom Znajdziesz programy C, które mogą wczytać plik binarny do pamięci i go uruchomić. Nie wiem jednak, czy Python jest wystarczająco niski, aby zrobić to w sposób C.
new123456
0

execSyscall jądra Linux nie ze EACCESjeśli plik nie jest wykonywalny

Chociaż możesz to zrobić sh myprog.sh, próba uruchomienia programu, ponieważ ./myprog.shnie może działać, ponieważ kiedy to zrobisz:

Można to zweryfikować za pomocą 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);
}

i myprog.sh:

#!/bin/sh
echo worked

Jeśli myprog.shnie jest wykonywalny, mainkończy się niepowodzeniem z:

execve: Permission denied
13
13

Testowane w Ubuntu 17.10, gcc -std=c99.

POSIX 7 wspomina, że ​​w:

Funkcje exec, z wyjątkiem fexecve (), zawiodą, jeśli:

[EACCES] Odmówiono pozwolenia na wyszukiwanie dla katalogu wymienionego w prefiksie ścieżki nowego pliku obrazu procesu lub nowy plik obrazu procesu odmawia pozwolenia na wykonanie.

Dalsze uzasadnienie można znaleźć na stronie : /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli
źródło