क्या मैं निष्पादित अनुमति के बिना एक लिनक्स बाइनरी निष्पादित कर सकता हूं जो सेट किया जा रहा है?


25

क्या लिनक्स के तहत एक निष्पादन योग्य बाइनरी फ़ाइल चलाने का एक तरीका है जिसमें निष्पादन बिट सेट नहीं है? 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 का मतलब क्या है?
विनीत मेनन

@VineetMenon ldप्रोग्राम लिंकर / लोडर है। यह प्रोग्राम द्वारा उपयोग किए गए साझा पुस्तकालयों को ढूंढता है और लोड करता है, और फिर इसे निष्पादित करता है। ld-linuxईएलएफ बायनेरिज़ संभालती है।
डैनियल बेक

ठीक है, क्या होगा अगर /lib/ld-linux.so.2निष्पादन योग्य नहीं है (क्या यह भी संभव है?)
लॉरेंस सी सी

@ultrasawblade AFAIK, केवल निष्पादन योग्य .soएस लोड किया जा सकता है, और ld-linuxमहत्वपूर्ण है।
डैनियल बेक

64-बिट उबंटू पर यह है/lib64/ld-linux-x86-64.so.2
टोर क्लिंगबर्ग

1

कम से कम, उसी तरह से नहीं। आप अभी भी एक बाइनरी निष्पादित कर रहे हैं जब आप अजगर बात करते हैं। पायथन + x है। आपको कुछ ऐसा संकलन करना होगा जो किसी फ़ाइल को लोड कर सके और उसे निष्पादित कर सके।

TiCL को अपनी प्रतिक्रिया का जवाब देना चाहिए क्योंकि यह जाने का सबसे अच्छा तरीका है।


हाँ, मैं समझता हूँ कि "अजगर" उस उदाहरण में एक द्विआधारी है। मैं जिस चीज की उम्मीद कर रहा था वह यह है कि "कुछ ऐसा संकलन करें जो किसी फ़ाइल को लोड कर सके और उसे निष्पादित कर सके" जो पहले से मौजूद है ...
Tom

@Tom आपको C प्रोग्राम मिलेंगे जो एक बाइनरी को मेमोरी में पढ़ सकते हैं और इसे निष्पादित कर सकते हैं। मैं नहीं जानता कि क्या पायथन निम्न स्तर पर सी तरीके से करने के लिए पर्याप्त है, हालांकि।
new123456

0

यदि फ़ाइल निष्पादन योग्य नहीं है, तो execलिनक्स कर्नेल का syscall विफल रहता 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 में उल्लेख है कि:

Fexecve () को छोड़कर निष्पादन कार्य, विफल हो जाएगा यदि:

[EACCES] नई प्रक्रिया छवि फ़ाइल के पथ उपसर्ग में सूचीबद्ध निर्देशिका के लिए खोज अनुमति से इनकार किया जाता है, या नई प्रक्रिया छवि फ़ाइल निष्पादन अनुमति से इनकार करती है।

इसके अलावा औचित्य यहां पाया जा सकता है: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-supercuous-or-whats-the

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.