実行許可ビットを設定せずにLinuxバイナリを実行できますか?


25

Linuxで実行ビットが設定されていない実行可能バイナリファイルを実行する方法はありますか?chmod +xオプションではありません。

たとえば、権限r--r--r--のみが許可される場合があります。

スクリプトを実行するには、実行ビットを設定せずに、ソースをインタプリタに渡すことにより、bash script.shまたはのようなシバンを挿入しpython script.pyます。

execute abinaryfileオブジェクトコードをメモリにロードして実行するようなものはありますか?


3
コピーを作成し、オプションをchmodしますか?
TiCL

いいえ、許可ビットを設定できない環境でバイナリを実行する方法があるのではないかと思います(指定されたファイルまたはそのコピーに...)
Tom

回答:


36

次のように、ELFインタープリターとして/lib/ld*.soを使用できます。

$ 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-linuxELFバイナリを処理します。
ダニエルベック

OK、/lib/ld-linux.so.2実行できない場合はどうでしょうか(それも可能ですか?)
LawrenceC

@ultrasawblade AFAIK、実行可能ファイルのみを.soロードできますld-linux。これは重要なことです。
ダニエルベック

64ビットUbuntuでは/lib64/ld-linux-x86-64.so.2
Tor Klingberg

1

いいえ。少なくとも同じ方法ではありません。pythonを実行するとき、まだバイナリを実行しています。Pythonは+ xです。ファイルをロードして実行できるものをコンパイルする必要があります。

TiCLは応答することをお勧めします。なぜなら、それが最善の方法だからです。


ええ、私は「python」がそのインスタンスのバイナリであることを理解しています。何を私は期待していたことは...「ファイルをロードし、それを実行することができ、コンパイル何か」がすでに存在していたということです
トム・

@Tomバイナリをメモリに読み込んで実行できるCプログラムがあります。ただし、PythonがCの方法でそれを行うのに十分な低レベルであるかどうかはわかりません。
new123456

0

ファイルが実行可能でない場合exec、Linuxカーネルのsyscallは失敗しEACCESます

あなたができる間、あなたがそれsh myprog.shをする./myprog.shときから、プログラムを実行できないようにしようとすると動作しません:

  • Bashはexecシステムコールを使用します ./myprog.sh
  • シバンは、https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-onでexec説明されているように、Linuxカーネルのシステムコールによって直接解釈されます-最初の行/ 40938801#40938801
  • Linuxカーネルは、実行許可なしでファイルの実行を拒否します

これは次の方法で確認できます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()を除くexec関数は失敗します。

[EACCES]新しいプロセスイメージファイルのパスプレフィックスにリストされているディレクトリの検索許可が拒否されているか、新しいプロセスイメージファイルが実行許可を拒否しています。

さらなる根拠は、https//security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-theで見つけることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.