私は大学コースの権限昇格に努めています。私は単にls
ビットの出力をコピーして設定する簡単なコードを持っていますSUID
。
int main(void){
system("/bin/ls");
return 0;
}
また、シェルとして機能するスクリプトをホームディレクトリに追加しました。
#!/bin/bash
/bin/sh
また、最初の変数である.
変数を追加しました。$PATH
したがって、Cでコードを実行するたびにbin
ホームディレクトリのスクリプトを呼び出す必要がありますが、変数が代わりにIFS
実行されるため、変数は完全に無視されます。なぜですか?/bin/ls
bin ls
答え1
プログラムは実行されません」bin
script"をホームディレクトリに保存します。を実行します"/bin/ls"
。システムコールはシェルを使用しますが、絶対パス名も使用します(実際にはPOSIX実行方法は実装によって定義されます。)シェルの選択にPATH
影響を与える方法はありません。ls
POSIX行動について次のようにIFS
言います。
実装が無視できる値
IFS
環境にあってもなくてもIFS
環境でシェルを呼び出すとき、シェルは以下を設定する必要があります。IFS<space>
<tab>
<newline>
呼び出されるまで。
実装について問い合わせる場合いいえこのように振る舞うと(POSIXはこれらの慣行が目立つほど頻繁に発生することを示唆しているため)、特定の実装が関連しているはずです。
答え2
system
コマンドを実行するために呼び出されたシェルが環境の値を尊重して/bin/ls
も、そのコマンドラインの解析には影響しません。IFS
IFS
シェルコマンドの解析には使用されません。コマンドは、行の表示方法を正確に指定するシェル構文を使用して単語に分割されます。 (メタ文字はタグを終了します。一部のメタ文字もタグです。)トークン化、尊重は引用されて
IFS
いない入力でのみ行われます。どんな形でも置換を経験します。したがって、コマンドがあり、$cmd
変数値がcmd
ある場合は、/bin/ls
代替IFS
テキストをトークン化するために使用されます。しかし:/bin/ls
単語分割にinを使用した/
結果IFS
は次のとおりです。サム性格。最初は空です。空の単語はコマンドとして使用できないため、実行しようとする代わりに何らかのエラーが発生しますbin
。