Чи можна виконати бінарний 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*.


чудова інформація ..... у будь-якому випадку, що означає ld?
Vineet Menon

@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 - це + x. Вам потрібно буде скласти щось, що може завантажити файл і виконати його.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.