1

コードの一部のセキュリティの問題を調査していますが、System.out.println("");ステートメントから抜け出して文字列を実行可能コードとして扱う方法があるかどうか疑問に思っていましたか?

たとえば、次の2行があります。

String exit = "System.exit(0);";
System.out.println(exit);

そのため、コンソールに出力する代わりに、"System.exit(0);"JVM がそれを実行可能コードとして処理するようにします。それは可能ですか?もしそうなら、誰かがそれを行う方法についてアイデアを持っていますか?

ありがとうございました

4

4 に答える 4

7

それは可能ですか?

いいえ。

最初に意図的に JVM などをいじらないわけではありません。

于 2012-04-11T00:47:24.097 に答える
2

それが可能だ:

  1. 必要なコードを含む Java ソース ファイルを生成します。
  2. 「javac」を実行してコンパイルします
  3. クラスローダを使用してバイトコードを JVM にロードする
  4. クラスを実行します (つまり、メソッドを呼び出します)。

次に、文字列を受け入れる単一のメソッドを持つクラスを作成し、次の 4 つの手順をすべて実行します。

JavaInterpreter.execute("System.exit(0);");
于 2012-04-11T00:48:29.500 に答える
2

はい、可能です。概念的には簡単ですが、実装するのは非常に困難です。私は自分の答えをテストしないので、完全に間違っているかもしれません。

カスタム PrintStream クラスを記述します。この PrintStream は、入力行ごとに次のような文字列を生成する必要があります

public class Xid implements Runnable { public void run ( ) { line } }

ここで、id は各行で一意であり、line は行のテキストです。

次に、そのテキストをコンパイラに送信する必要があります。

次に、クラス Xid をロードし、そのインスタンスを作成して実行します。

そのような PrintStream クラスを作成したら、そのインスタンスを作成してSystem.setOut(out)outを使用します。

于 2012-04-11T01:12:18.890 に答える
0

コードの一部でいくつかのセキュリティの問題を調査しており、System.out.println(""); から抜け出す方法があるかどうか疑問に思っていました。文字列を実行可能コードとして扱いますか?

エモリーの答えによると、これを行うことは可能です。ただし、それを行うには、まずアプリケーションにコードを挿入できる必要があります (*)。また、コードを挿入できる場合は、JVM をシャットダウンするはるかに簡単な方法があります。そう:

  • これは、Java アプリケーションの新しいセキュリティ リスクを表すものではありません。
  • これは、他人の Java アプリケーションを危険にさらす賢明な方法ではありません。

* このコード インジェクションは、既存または新規の Java セキュリティ ホールの使用を伴う可能性があります。または、単に Java アプリケーションのソース コードまたはビルド プロセスの変更、またはホスト コンピューターの侵害後のアプリケーションのバイトコードの変更を伴う可能性があります。

于 2012-04-11T04:05:20.600 に答える