バッファオーバーフロー(BOF)について知り、複製していた Techorganicによって記述された簡単な攻撃 。彼らは「classic」と呼ばれる単純なCプログラムを作成します。 STDINから80バイトのバッファーに最大400バイトを読み取り、それを利用するための適切なバッファーを作成し、そのバッファーを「in.txt "。コースは順調に進んでいますが、すべての準備が完了すると、次のコマンドでプログラムを実行します。
user@pc$ (cat in.txt ; cat) | ./classic
私の最初の考えは「聖なるモリー、そこで何が起こっているのですか?」、元のアイデアはシンプルで、実行されましたclassicそしてバッファを入力し、私の意図はそれを次のように実行することでした:
user@pc$ ./classic < in.txt
他の人間と同じように。しかし、驚いたことに、彼らのやり方はうまくいき、私のやり方はうまくいきません。
結論としては、最初の構文は何を行い、それらが意味的に等しい(または類似しているように見える)にもかかわらず、それらのソリューションを機能させ、機能させない主な違いは何ですか?.
最初のcat
コマンドは、in.txt
からの入力をプログラムのstdinに送ります。 2番目のcat
コマンドは、現在のstdinから読み取ってプログラムにフィードするだけなので、このコマンドラインを実行するユーザーに、端末からプログラムに独自のデータをフィードする方法を提供します。 /bin/sh
または同様のものがこのプログラムから実行されます。
これとは対照的に、単にprogram < in.txt
を使用すると、in.txt
がプログラムのstdinにフィードされ、プログラムのこのstdinが閉じられた後に終了します。これは、端末からのユーザー入力がプログラムとその内部で実行されているシェルに供給されないことを意味します。