Tôi có thể thực thi nhị phân Linux mà không cần đặt quyền thực thi không?


25

Có cách nào để chạy một tệp nhị phân thực thi trong Linux mà không có tập bit thực thi không? chmod +xkhông phải là một sự lựa chọn.

Ví dụ, quyền của nó có thể là r--r--r--duy nhất.

Có thể thực thi các tập lệnh mà không cần thiết lập bit thực thi và đưa vào một shebang bằng cách chuyển nguồn tới trình thông dịch, ví dụ bash script.shhoặc python script.py.

Vì vậy, có cái gì đó như thế execute abinaryfilesẽ tải mã đối tượng vào bộ nhớ và chạy nó?


3
tạo một bản sao và chmod một tùy chọn?
TiCL

Không, tôi tự hỏi liệu có cách nào để thực thi nhị phân trong môi trường không thể đặt bit quyền (trên tệp đã cho hoặc bất kỳ bản sao nào của nó ...)
Tom

Câu trả lời:


36

Bạn có thể sử dụng /lib/ld*.so làm trình thông dịch ELF, như vậy:

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

Tên thực tế khác nhau từ kiến ​​trúc để kiến ​​trúc. Một số tên bao gồm /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2/lib/ld-2.7.so. Bạn có thể tìm thấy nó đơn lẻ như /lib/ld*.


thông tin tuyệt vời ..... dù sao thì ld là viết tắt của gì?
Vineet Menon

@VineetMenon ldlà trình liên kết / trình tải chương trình. Nó tìm và tải các thư viện chia sẻ được sử dụng bởi chương trình, và sau đó thực thi nó. ld-linuxxử lý nhị phân ELF.
Daniel Beck

Ok, điều gì sẽ xảy ra nếu /lib/ld-linux.so.2không thể thực thi được (thậm chí còn có thể?)
LawrenceC

@ultrasawblade AFAIK, chỉ .socó thể tải s thực thi và ld-linuxlà loại quan trọng.
Daniel Beck

Trên Ubuntu 64-bit, đó là/lib64/ld-linux-x86-64.so.2
Tor Klingberg

1

Ít nhất, không theo cùng một cách. Bạn vẫn đang thực hiện một nhị phân khi bạn làm điều python. Python là + x. Bạn sẽ cần phải biên dịch một cái gì đó có thể tải một tập tin và thực hiện nó.

TiCL nên làm cho câu trả lời của anh ấy / cô ấy vì đó là cách tốt nhất để đi.


Vâng, tôi hiểu "python" là một nhị phân trong trường hợp đó. Điều tôi đã hy vọng là "biên dịch thứ gì đó có thể tải tệp và thực thi nó" đã tồn tại ...
Tom

@Tom Bạn sẽ tìm thấy các chương trình C có thể đọc nhị phân vào bộ nhớ và thực thi nó. Tuy nhiên, tôi không biết Python có đủ trình độ thấp để làm điều đó theo cách C.
new123456

0

Tòa nhà execcủa nhân Linux không thành công EACCESnếu tệp không thể thực thi được

Trong khi bạn có thể làm sh myprog.sh, cố gắng chạy chương trình như ./myprog.shkhông thể làm việc, kể từ khi bạn làm điều đó:

Điều này có thể được xác minh với 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

Nếu myprog.shkhông thể thực thi được, mainthất bại với:

execve: Permission denied
13
13

Đã thử nghiệm trong Ubuntu 17.10 , gcc -std=c99.

POSIX 7 đề cập rằng tại:

Các hàm exec, ngoại trừ fexecve (), sẽ thất bại nếu:

[EACCES] Quyền tìm kiếm bị từ chối đối với một thư mục được liệt kê trong tiền tố đường dẫn của tệp hình ảnh quy trình mới hoặc tệp hình ảnh quy trình mới từ chối quyền thực thi.

Cơ sở hợp lý khác có thể được tìm thấy tại: /security/66550/unix-execute- allow-can-be- easy-bypassed-is-it-superfupt-or-why-the

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.