Yürütme izni biti ayarlanmadan bir Linux ikili dosyasını çalıştırabilir miyim?


25

Linux altında yürütülebilir bit dosyasını çalıştırmanın bir yolu var mı? chmod +xbir seçenek değil.

Örneğin, r--r--r--sadece izinleri olabilir .

Betiklerin çalıştırılması, yürütme bitini ayarlamadan ve kaynağı tercümana, örneğin bash script.shveya python script.py.

Öyleyse, execute abinaryfilenesne kodunu belleğe yükleyip çalıştıracak bir şey var mı?


3
bir kopya yapmak ve bir seçenek chmod?
TiCL

Hayır, izin bitinin ayarlanamadığı bir ortamda bir ikili dosya yürütmenin bir yolu olup olmadığını merak ediyorum (verilen dosyada ya da kopyalarında ...)
Tom

Yanıtlar:


36

/Lib/ld*.so dosyasını aşağıdaki gibi bir ELF yorumlayıcısı olarak kullanabilirsiniz:

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

Gerçek isim mimariden mimariye değişiyor. Bazı isimler şunlardır /lib/ld-linux.so.2, /lib/ld-linux-x86-64.so.2ve /lib/ld-2.7.so. Muhtemelen onu tekil olarak bulabilirsiniz /lib/ld*.


harika bilgi ..... yine de ld ne anlama geliyor?
Vineet Menon

@VineetMenon ld, program linker / yükleyicidir. Program tarafından kullanılan paylaşılan kütüphaneleri bulur ve yükler, ardından çalıştırır. ld-linuxELF ikili dosyalarını yönetir.
Daniel Beck

Tamam, peki ya /lib/ld-linux.so.2çalıştırılamazsa (bu mümkün mü?)
LawrenceC

@ultrasawblade AFAIK, yalnızca çalıştırılabilir dosyalar .soyüklenebilir ve ld-linuxbu tür önemli.
Daniel Beck

64-bit Ubuntu'da, öyle/lib64/ld-linux-x86-64.so.2
Tor Klingberg,

1

Hayır. En azından aynı şekilde değil. Python işini yaparken hala bir ikili dosya yürütüyorsunuz. Python + x'tir. Bir dosyayı yükleyebilecek ve çalıştırabilecek bir şey derlemeniz gerekir.

TiCL yanıtını bir cevap olarak vermeli çünkü gitmenin en iyi yolu bu.


Evet, "python" un bu durumda bir ikili olduğunu anlıyorum. Umduğum şey, "bir dosyayı yükleyip çalıştırabilecek bir şeyi derlemek" zaten vardı ...
Tom

@ Tom Bir ikiliyi hafızaya okuyan ve yürüten C programlarını bulacaksınız. Yine de Python'un C yolunda yapmak için yeterince düşük olup olmadığını bilmiyorum.
yeni123456

0

execLinux çekirdeğinin syscall ile başarısız EACCESdosya çalıştırılabilir değilse

Yapabildiğiniz halde sh myprog.sh, programı çalıştıramayacağınız şekilde çalıştırmaya ./myprog.shçalışmak, bunu yaptığınızdan beri

Bu doğrulanabilir 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);
}

ve myprog.sh:

#!/bin/sh
echo worked

Eğer myprog.shçalıştırılabilir değil, mainbaşarısız:

execve: Permission denied
13
13

Ubuntu'da test edildi 17.10 gcc -std=c99,.

POSIX 7 şunlardan bahseder:

Fexecve () dışında exec işlevleri, aşağıdaki durumlarda başarısız olur:

[EACCES] Yeni işlem görüntü dosyasının yol ön ekinde listelenen bir dizin için arama izni reddedildi veya yeni işlem görüntü dosyası yürütme iznini reddetti.

Diğer gerekçeleri şu adreste bulabilirsiniz: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.