24

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

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

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

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

3 ответа3

34

Вы можете использовать /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* .

1

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

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

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] Отказано в разрешении на поиск для каталога, указанного в префиксе пути нового файла образа процесса, или новый файл образа процесса запрещает разрешение на выполнение.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .