問題タブ [execve]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ファイルシステムベースの機能が欠落しているにもかかわらず、機能を保持しながらプロセスを実行するにはどうすればよいですか?
setuid
ファイル「+p」機能なしで、一般にPR_SET_NO_NEW_PRIVSを設定したときに無効になるものなしでシステムを使用できるようにしたい。
このアプローチ(init
セットPR_SET_NO_NEW_PRIVS
およびファイルシステムベースの機能の昇格は不可能)では、機能を「補充」することはできず、機能を「飛び散らせ」ないように注意する必要があるだけです。
execve
付与された機能を「飛び散らせる」ことなく(新しいプログラムのファイルがである場合など)、他のプロセスを実行するにはどうすればよいですsetcap =ei
か?「私は自分自身を信頼するので、この新しいプロセスを信頼します」。たとえば、機能がユーザーに与えられます(そして、ユーザーは自分が開始する任意のプログラムでそれを実行したいと考えています)...
ファイルシステム全体を永続的に作成できます=ei
か?ファイルシステムがスキームに干渉しないようにし、機能を付与または取り消すことができないようにしたい。親->子のものを通してすべてを制御します。
c - execve システム コールを使用した C でのネットワーク プログラミング
クライアントがTCPソケットを使用してサーバーに接続できるようにし、ユーザーがクライアント側からサーバー側にシステムコールを発行して応答を返すことができるようにする単純なクライアント/サーバープログラムを作成しようとしています。例えば:
クライアントの問題: ls
サーバーは /usr/bin または w/e で ls を見つけ、execve() を使用して実行します。
また、クライアント側でシステム コールを発行する lls や lmkdir などのようなものも用意します。
問題は、「ls」またはその他のコマンドが実際に呼び出されていないため、私の execve() が正しく実行されていないように見えることです。私はこれと同じ種類のプログラムを以前にローカル側のみ(サーバーなどなし)で実行したことがあり、execve()は正常に機能しました。ここにいくつかのコードがあります:
何らかの理由で、PID ステートメントの子セクションの printfs がまったく実行されていません。システムが実際にプロセスをフォークしているとは思いません。クライアント/サーバータイプのプログラムであるため、これを機能させるために何か特別なことをしなければなりませんか、それともまったく同じように機能する必要がありますか?
ありがとう
bash - フォーク内のフォークのすべての pid を知る方法は?
例:
ターゲット: $1 を実行し、すべてのフォークの pid を収集するスクリプトfollow.shを作成します。そのように:
その例では4つの数字)。しばらくしてから数字が表示される場合があります。pidtracerのようなユーティリティfollow.shの既知の名前があるのでしょうか?
linux - カーネル: do_execve_common でコマンドラインと pid_parent を取得していますか?
Linux カーネルの do_execve_common で作成されようとしているプロセスのコマンド ラインを取得することはできますか? つまり、argv からコマンドラインを抽出して dmesg に printk する方法です。
次に、プロセスの pid と親 pid を取得することもできますか? この情報は do_execve_common のどこかで入手できますか?
これらのことはカーネル内でのみ行う必要があります。
linux - 3.5カーネルでのsys_execveフック
x86_32上のLinuxカーネルv3.5でsys_execvesyscallをフックしようとしています。sys_call_tableエントリアドレスをフック関数に変更するだけです
sys_call_tableエントリを変更するためのページ権限を設定しましたが、前述のスキームは別のsyscall(chdir、mkdirなど)でもうまく機能します。しかし、execveフックで、nullポインターの逆参照が発生しました。
arch/x86/kernel/entry_32.S
が含まれているため、3つのパラメーターを使用してsys_execveを呼び出しますPTREGSCALL3(execve)
。ただし、4つのパラメーター(追加struct pt_regs*
)を使用して呼び出しようとしましたが、同じエラーが発生しました。たぶん、実行するためのこのアプローチに何かが完全に間違っていますか?それとも私は何かを逃しましたか?
更新#1
実際には(ではなく)sys_call_table[ __NR_execve ]
のアドレスが含まれていることがわかりました。それは次のように定義されています:ptregs_execve
sys_execve
arch/x86/kernel/entry_32.S
したがって、変更sys_execve
するには、アドレスを変更せずにコードを置き換える必要がありますか?私はここで似たようなものを読みました、これは行く方法ですか?
更新#2
実際、私は次の呼び出しシーケンスを見つけました。do_execve->do_execve_common->search_binary_handler->security_bprm_check
これsecurity_bprm_check
は、バイナリの実行を制御するLSM(Linux Security Module)操作のラッパーです。その後、私はこのリンクを読んでたどりました、そして私はそれを動かしました。実行するプロセスの名前が表示されるようになったので、問題は解決しましたが、それが正しいかどうかはまだわかりません。たぶん、他の誰かがこれらすべてのものについていくらかの明確さを追加するでしょう。
linux - execve なしでバイナリを実行しますか?
他のバイナリを(実際の「execve」syscallなしで)ロードするために、execve(主にopenとmmapを使用)を「エミュレート」できるとどこかで述べたのを見ました。
- すでに実装されている例はありますか?
- 静的バイナリと動的バイナリの両方をロードできますか?
- ポータブルにできますか?
このような機能は、ファイルシステム ビットを無視するか、実際の execve を許可しないようにインストールされた seccomp ポリシーを使用して、任意のバイナリに作業を委任するのに役立つ場合があります。
c++ - C++execveコマンドで文字列をchar[]*に変換するにはどうすればよいですか?
execveコマンドを使用しようとすると、最後の2つの引数に関するエラーが表示されます。
次のような文字列をコピーする際に、いくつかの異なるオプションを使用してみました。
しかし、それを機能させてエラーメッセージを受け取ることができません:
エラー:引数3のchar*をchar* const*に変換できませんintexecve(const char *、char * const *、char * const *)
c - シェルコード: 2 つの execve() 呼び出しを実行
アセンブリでシェルコードを書こうとしています。/usr/bin/killall
コマンドとコマンドを実行する必要があります/usr/bin/wget
。システムコールを使用して、シェルコードで両方のコマンドを完全に実行していexecve()
ます。execve()
しかし、これら2つを組み合わせたいのですが、最初の呼び出しが実行されるとプログラムが終了するため、これは不可能です。(のmanページからexecve()
:execve()
成功しても返されません)。
execve()
2コールを実行するにはどうすればよいですか? または、同じシェル コードからと の両方/usr/bin/killall
を呼び出す別の方法はありますか?/usr/bin/wget
よろしくお願いします!
linux - strace が HDD IOCTL システムコールを表示しないのはなぜですか?
を実行strace -ttT date
すると、実行可能ファイルの起動直後に多くのシステムコールが見逃されます。execve() の後、date
ELF が HDD からメモリにコピーされるシステムコールはありません。これはカーネル内で発生しますか? 各バイトがブロック単位でメモリにロードされる HDD コントローラへの IOCTL が多数表示されると思いましたか?