Могу ли я выполнить бинарный файл Linux без установленного бита разрешения на выполнение?

25

Есть ли способ запустить исполняемый двоичный файл в Linux, в котором не установлен бит выполнения? chmod +xэто не вариант.

Например, это могут быть r--r--r--только разрешения .

Выполнение сценариев возможно без установки бита выполнения и добавления шебанга путем передачи источника интерпретатору, например, bash script.shили python script.py.

Так что-нибудь подобное execute abinaryfileзагрузит объектный код в память и запустит его?

Том
источник
3
сделать копию и chmod вариант?
TiCL
Нет, мне интересно, есть ли способ выполнить двоичный файл в среде, где бит разрешения не может быть установлен (для данного файла или любых его копий ...)
Том

Ответы:

36

Вы можете использовать /lib/ld*.so как ELF-интерпретатор, например так:

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

Фактическое имя отличается от архитектуры к архитектуре. Некоторые имена включают в себя /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2и /lib/ld-2.7.so. Вы, вероятно, можете найти это как /lib/ld*.

Dolda2000
источник
отличная информация ..... в любом случае, что означает ld?
Вине Менон
@VineetMenon ld- программа-компоновщик / загрузчик. Он находит и загружает разделяемые библиотеки, используемые программой, а затем выполняет ее. ld-linuxобрабатывает двоичные файлы ELF.
Даниэль Бек
Хорошо, что, если /lib/ld-linux.so.2не выполнимо (это вообще возможно?)
LawrenceC
@ultrasawblade AFAIK, .soмогут загружаться только исполняемые файлы s, и ld-linuxэто очень важно.
Даниэль Бек
На 64-битной Ubuntu это/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

Нет. По крайней мере, не так. Вы по-прежнему выполняете двоичный файл, когда делаете Python. Питон + х. Вам нужно будет скомпилировать что-то, что может загрузить файл и выполнить его.

TiCL должен сделать свой ответ ответом, потому что это лучший путь.

Павел
источник
Да, я понимаю, что "Python" является двоичным в этом случае. На что я надеялся, так это на то, что «скомпилировать что-то, что может загрузить файл и выполнить его» уже существует ...
Том
@Tom Вы найдете программы на C, которые могут прочитать двоичный файл в память и выполнить его. Однако я не знаю, достаточно ли низок уровень Python для того, чтобы делать это на С.
new123456
0

execСистемный вызов в Linux ядра не удается с , EACCESесли файл не является исполняемым

Хотя вы можете это сделать sh myprog.sh, пытаясь запустить программу как ./myprog.shне может работать, так как, когда вы делаете это:

Это можно проверить с помощью 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);
}

и myprog.sh:

#!/bin/sh
echo worked

Если myprog.shэто не исполняемый файл, происходит mainсбой с:

execve: Permission denied
13
13

Проверено в Ubuntu 17.10 gcc -std=c99.

POSIX 7 упоминает, что в:

Функции exec, за исключением fexecve (), должны завершиться ошибкой, если:

[EACCES] В доступе к каталогу, указанному в префиксе пути нового файла образа процесса, отказано в разрешении на поиск, либо в новом файле образа процесса запрещено разрешение на выполнение.

Дополнительную информацию можно найти по адресу: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник