Bisakah saya menjalankan biner Linux tanpa bit izin eksekusi ditetapkan?

25

Apakah ada cara untuk menjalankan file biner yang dapat dieksekusi di Linux yang tidak memiliki bit eksekusi? chmod +xbukan pilihan.

Misal izinnya mungkin r--r--r--saja.

Eksekusi skrip dimungkinkan tanpa menetapkan bit eksekusi dan meletakkan shebang dengan mengirimkan sumber ke penerjemah, misalnya bash script.shatau python script.py.

Jadi apakah ada sesuatu seperti execute abinaryfileitu yang akan memuat kode objek ke dalam memori dan menjalankannya?

Tom
sumber
3
membuat salinan dan chmod opsi?
TiCL
Tidak, saya ingin tahu apakah ada cara untuk menjalankan biner di lingkungan di mana bit izin tidak dapat ditetapkan (pada file yang diberikan atau salinannya ...)
Tom

Jawaban:

36

Anda dapat menggunakan /lib/ld*.so sebagai juru bahasa ELF, seperti:

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

Nama sebenarnya berbeda dari arsitektur ke arsitektur. Beberapa nama termasuk /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2dan /lib/ld-2.7.so. Anda mungkin dapat menemukannya secara tunggal /lib/ld*.

Dolda2000
sumber
info hebat ..... lagipula apa arti ld?
Vineet Menon
@VineetMenon ldadalah penghubung / pemuat program. Itu menemukan dan memuat pustaka bersama yang digunakan oleh program, dan kemudian menjalankannya. ld-linuxmenangani binari ELF.
Daniel Beck
Oke, bagaimana jika /lib/ld-linux.so.2tidak dapat dieksekusi (apakah itu mungkin?)
LawrenceC
@ultrasawblade AFAIK, hanya .sos yang dapat dieksekusi yang dapat dimuat, dan ld-linuxagak penting.
Daniel Beck
Pada Ubuntu 64-bit, itu adalah/lib64/ld-linux-x86-64.so.2
Tor Klingberg
1

Setidaknya, tidak dengan cara yang sama. Anda masih menjalankan biner ketika Anda melakukan hal python. Python adalah + x. Anda perlu mengkompilasi sesuatu yang dapat memuat file dan menjalankannya.

TiCL harus menjawabnya karena itu adalah cara terbaik untuk melakukannya.

Paul
sumber
Ya, saya mengerti "python" adalah biner dalam contoh itu. Apa yang saya harapkan adalah bahwa "kompilasi sesuatu yang dapat memuat file dan menjalankannya" sudah ada ...
Tom
@ Tom Anda akan menemukan program C yang dapat membaca biner ke dalam memori dan menjalankannya. Saya tidak tahu apakah Python cukup rendah untuk melakukannya dengan cara C.
new123456
0

The execsyscall dari kernel Linux gagal dengan EACCESjika file tersebut tidak executable

Meskipun Anda dapat melakukannya sh myprog.sh, mencoba menjalankan program karena ./myprog.shtidak dapat bekerja, karena ketika Anda melakukannya:

Ini dapat diverifikasi dengan 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);
}

dan myprog.sh:

#!/bin/sh
echo worked

Jika myprog.shtidak dapat dieksekusi, maingagal dengan:

execve: Permission denied
13
13

Diuji di Ubuntu 17.10 gcc -std=c99,.

POSIX 7 menyebutkan bahwa pada:

Fungsi exec, kecuali untuk fexecve (), akan gagal jika:

[EACCES] Izin pencarian ditolak untuk direktori yang tercantum dalam awalan path file gambar proses baru, atau file gambar proses baru menolak izin eksekusi.

Dasar pemikiran lebih lanjut dapat ditemukan di: /security/66550/unix-execute-permission-can-be-easy-bypassed-is-it-superfluous-atau-whats-the

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber