問題タブ [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.
c - Ubuntu 14 で「do_execve」への Jprobe が機能しないが、Ubuntu 12 では機能する
Jprobes を使用して Linux カーネルで関数 'do_execve()' へのフックを実行しようとしていますが、特定のシステムで問題が発生しています。Ubuntu 12、64ビット(カーネルバージョン3.11)でオンラインで見つけたこのコードを使用してみました:
Hook.c:
メイクファイル:
モジュールは期待どおりに機能しました。最初にシステム上で正しくコンパイルされ、次に関数「insmod」で挿入されました (ROOT 権限で)。dmesg を実行すると、正しい出力が表示されます。
この問題は、Ubuntu 14、64 ビット (カーネル バージョン 3.13) システムで同じコードを試したときに発生しました。システムで再コンパイルして、以前のシステムで行ったのと同じように挿入しましたが、今回は機能しませんでした。エラーは発生せず、成功メッセージ (「Planted jprobe at [ADDRESS WAS HERE], handler addr [ADDRESS WAS HERE]」) が出力されますが、「do_execve」行は出力されません。Google をスキャンしましたが、説明や解決策が見つかりませんでした。何か案は?
注: Ubuntu 14 で「do_fork()」をフックしてみましたが、うまくいきました。これは「do_execve()」を使ったもので、何が何だかわかりません!
c - c での execve() の使用
ac プログラムで execve() の環境を指定する方法の具体例を見る必要があります。私のクラスでは、標準の LINUX 実行可能ファイルと独自の実行可能ファイルの両方を利用するプログラムを作成しています。したがって、PATH を検索する環境には、両方のタイプの実行可能ファイルのトークンが含まれている必要があります。どの記事でも execvp() または *clp() または *cl() などを代わりに使用するように提案されているため、execve() の環境 (3 番目の引数) を指定する方法の良い例を見つけることができません。
私のプロジェクトでは、execve() を使用する必要があります。
現在、基本的な「ls」コマンドで execve() を機能させようとしているだけなので、後ですべての実行可能ファイルで機能させることができます。
これが私の実験コードのスニペットです:
コマンド「1」をシェルに入力するたびに、エラー メッセージが表示されます。これは、env_args[] を宣言する方法が原因であると思われます。
指定されたコマンド検索環境で execve() を実装する方法の良い例を教えてもらえますか?
c - C execve() パラメータ [シェルの例を生成]
次のパラメーターを入力する必要があります。
このプログラムを実行すると:
シェルは期待どおりに正しく生成されます。
私の問題は、次のように NULL を 2 番目のパラメーターとして渡すと、シェルが正しく生成されることです。
では、NULL の代わりに args ベクトル ("/bin/sh" + NULL) を 2 番目のパラメーターとして使用する目的は何ですか?
execve - 公式の CPE 辞書に既存の CPE はありません
一部の CVE では、次のようなCPEを読み取ることができます。
cpe:/a:libcap:libcap:2.00
cpe:/a:gnome:libsoup:2.32.2
cpe:/a:libgtop:libgtop:2.14.5
しかし、libcapもlibsoupもlibgtopも公式のCPE辞書にはありません!!
(XMLファイルまたはオンライン検索: https://nvd.nist.gov/cpe.cfm )
どうすれば可能ですか?
ありがとう、フロラン
c++ - C++ で外部プログラムを動的に実行および終了する
各プロセスを制御しながらプロセスを実行する必要があります。スレッドやpid、またはそのために必要なものを格納するクラスを作成したいと考えています。
私は現在、C 関数 execvp を使用して 1 つの外部アプリケーションを実行し、シェル スクリプトから環境をロードするプログラムを持っています。だから私の現在のプログラムはブロックしています。しかし、私はそれを自由に実行し続けることができる必要があり、現在実行中のアプリケーションを終了するか、新しい外部アプリケーションを開始するときまでにのみ実行する必要があります.
私の現在のアプローチは、execve 関数を使用するスレッドを作成することです。しかし、私が見る限り、スレッドはブロックされます。
スレッドにある可能性のあるコード(変数を使用):
呼び出されるアプリケーションは、パラメータを含む外部セットアップ ファイルによって名前が付けられるコードでおそらく固定されていません。
私の実際の質問は、C ++でそのような外部アプリケーションを「管理」するためのより良い方法はありますか? いくつかの準備ができているソリューション (クラス、ライブラリ)? そうでない場合、これが実際の方法である場合、スレッドを終了するにはどうすればよいですか。終了呼び出しを使用することは悪い習慣であると言われています。それは私がよく読むものです。
これがフォーラムにとって十分に具体的であることを願っています。これ以上具体的にする方法がわからないからです。ここで作成したいものについてさらにヒントが必要な場合は、コメントでお気軽にお問い合わせください。
更新:
DBus などへ:
追加情報 開始したいすべてのプロセスを書いているわけではありません。したがって、コードを持っていても変更したくないサードパーティのアプリケーションを起動するために使用されます。
c - このコードの最初の反復後の予期しない出力
正直なところ、次のことがどのように起こるのかわかりません。コードは次のとおりです。
read_command() は、基本的に入力された文字列の「配列」である char** を返し、各 char* には単語が含まれます。たとえば、「hello people of earth」と入力すると、結果は ["hello", "people", "of", "earth"] になります。この関数は常に機能します。
最初の反復では、すべてが期待どおりに機能します。たとえば、「date」と入力すると、出力は次のようになります。
しかし、2回目の繰り返しで、入力として「日付」を再度使用すると、出力は次のようになります。
2 番目の printf ステートメントは、「hello」のような定数文字列を出力しても、最初の繰り返しの後に常に「e」を出力します。そして、コマンドポインターには「日付」が1つしかありませんが、パラメーター[0]にはどういうわけか2つの「日付」があります。
そして 3 回目の反復の後、プログラムはユーザー入力を待たず、ノンストップでループし、「PM: 警告、プロセス テーブルがいっぱいです!」と表示します。
何が原因でしょうか?
C用のccコンパイラを使用してMINIX 3.1.0で作業しています
編集: read_command():
linux - jprobe do_execve がカーネル 4.1 で動作しない
do_execve に jprobe フックを設定して、実行されたすべてのプログラムをキャッチしたいと考えています。
私のコードは <= 3.2 Linux カーネル (debian) で動作しています。これは、Linux カーネル 3.2 での私の出力です。
4.1カーネルでは同じ結果(すべてが登録されています)ですが、「execve」はありません:
そして、これは私のコードです:
kallsyms で grep を実行すると、3.2 になります。
そして4.2で:
関数を次のように変更しようとしました (do_execve プロトタイプが変更されたため)。
それでも役に立ちませんでした。
do_fork や sys_open などの他の関数にはフックを設定できますが、do_execve には設定できません。なんで?誰にもアイデアがありますか?なぜ機能しなくなったのですか?
編集:
do_execveat もフックしています。
linux - システム コール トレーサーの奇妙な事件
基本的なシステム コール トレーサを作成しています。その基本的な操作は、子を生成し、そのシステム コールをインターセプトし、カウントアップし、子が閉じた後に結果をファイルにダンプすることです。
一般的な端末プログラムでトレーサーをテストしています。奇妙なことに、子プロセスが生成されるとすぐに、複数のexecve呼び出しが連続してカウントされることがあります。たとえば、lsでプログラムをテストすると、システム コール トレーサは ls が生成された直後に 7 つの execve をカウントします。しかし、\bin\lsでシステム コール トレーサをテストすると (他に変更はありません)、システム コール トレーサは 1 つの execve コールしかカウントしません。これは上記の場合と同じです。
異なるカウントが得られるのはなぜですか? シェルは私が知らない呼び出しを行っていますか?