echo 'main(){}' | gcc -xc - -o /dev/stdout | ???
UNIXシリーズシステムで出力バイナリを実行する方法はありますか?
編集する:出力を作成できないサンドボックス環境でg ++を実行するには、これが必要です。どのファイル(悪意のある意図がないことを約束します)。
ベストアンサー1
私はこれが可能だとは思わない。これ実行(2)システムコールには常にファイル名または絶対パスが必要です(ファイル名は常にchar*
)。 posix_spawn
ファイル名にも同様の要件があります。
最も近い方法は、出力を名前付きパイプに接続してパイプで実行しようとすることです。シェルはビットが設定されていないファイルの実行を拒否する可能性がありますが、--x--x--x
これは機能します。パイプラインの作成mkfifo(1)
あなたがそれを動作させることができることを確認してください。
別のアプローチは、標準入力を読み込み、ファイルを一時領域に書き込み、そこに--xビットを設定し、分岐して実行し、ファイルを削除することを書くことです。 inodeと内容はプログラムの実行が完了するまで保持されますが、ファイルシステムを介してアクセスすることはできません。プロセスが終了すると、inode が解放され、ストレージ・スペースが使用可能リストに戻されます。
編集する:Matが指摘したように、最初のアプローチはローダーが実行可能ファイルからページを要求しようとするので、うまくいきません。これにより、パイプは不可能なファイルに対するランダム検索トラフィックを生成します。これは2番目の方法のようなものを残します。