長いsschpealヘッドが必要ない場合は、最後の段落->
gets()
関数のローカル1024文字*バッファを埋めるために使用しているプログラムにバッファオーバーフローの脆弱性が見つかりました。Sparc Solaris 5.8(sun4u)32ビット上にあります。
克服すべき最初の障害は、tch
手動で257文字以上を入力できないことでした(Enterキーを押したい場合は256文字)。
これを回避するために、私は実行/bin/sh
していてstty raw
、1095文字を超えるバッファを効果的にオーバーフローさせることができます。(注:ラインフィード/入力を行うにはCtrl-Jを使用する必要がありますが、この変更が発生する理由を調べるためにsttyrawを調査していません。
私の問題はこれです:バッファをオーバーフローさせるだけでなく、新しいリターンアドレスを書き込む/ 16進コードで%fpを保持する時が来ました。しかし、ターミナルプログラム内から16進コードを手動で入力する方法がわからないため、Cを使用して、脆弱なプログラムを実行/対話し、最終的にカスタムバッファを送信する方法を見つけることができると考えました。
ただし、16進バイトを手動で入力/コピーして貼り付ける方法があれば、このような簡単なことを実行できます。
perl -e 'print "n" . "A"x1094 . "\xff\xbe\xf5\x58" . "\xff\xbe\xff\x68" . "\0"'
(なぜ私が'n'を出力しているのか疑問に思っているのなら、脆弱なプログラムが文字列のyes / no @ index 0をチェックするからです)
このような16進情報を手動で貼り付ける方法がわからないため、Cで試しています。Cでは、特別なバッファーを作成しpopen()
、脆弱なプログラム( "w")を学習して、バッファーをfputしましたが、せいぜいiffyで動作します。(popenで、IPC
私にとってはまったく新しいものです)
(私も試しpiping/dup2ing
ましたが、結果は得られず、効果的な文字列の出力/入力の証拠もありませんでした)何が問題になっているのかわからないので、コードを何度も試し、後でそれを放棄しました。
私の「popen」プログラムからの出力を表すのに最適なのは、インデックス[1096-> 1099]でバッファを区切るだけで、脆弱なプログラムにセグメンテーション違反が発生することです。これは事実上、関数の場所である%fp
ため、正常に見えました@最初。ただし、これよりも高いインデックスで文字列を区切ると、プログラミングは正常に機能します(WTF)!!! そして、そのような振る舞いは私にWTFを考えさせます!!?これは手動で貼り付けるのと同じ動作ではありません。文字を増やすと、セグメンテーション違反->バスエラーが最も確実に変化します。次に、リターンアドレスを上書きし、その後にそのスタックフレーム内およびそれ以降の重要な情報を上書きするためです。
文字列全体が実際に1回の強打で送信されないのですか?!?!?fflush()
からバッファの問題について何か聞いたのですpopen() manpage
が、その話がわかりません!!
を使用するのは初めてpopen()
で、奇妙だと思った動作がさらにあります->fputs()
データを停止すると、脆弱なプログラムは無限ループに入り、通常は1回しか出力されない最後の出力文字列を繰り返し出力しますが、これでは場合によっては、fputingを停止すると、無限に印刷が開始されます。さて、私が出力していないのなら、プログラムはただ座って、良いアヒルのようにさらなる入力を待つのではないかと期待していました。??? どうやらそうではありません。次の文字列を入力する必要があるのは、どうやら小便とうめき声を続けなければならないようです!これはpopenでの通常の動作ですか?!おそらく、実際に終了する前に、私のpopen'プログラムがpclose()で終了して終了したことが原因です(ただし、バッファオーバーフローが予想されていたため、手動で貼り付けた場合のように取得できない理由がわかりません)
注:「\ r \ n」を使用して、脆弱なプログラムに「return」を実行するように通知しています。CTRL-J/ Enterキー(Enterキーはraw ttyでは機能しません)に相当するものかどうかはわかりません。また、バッファを配管するときにrawttyが必要かどうかもわかりません。
それから私は賢くして文字列をファイルにキャットし、コマンドラインを介してパイプを実行しようと思った。この形式の入力を期待するプログラムにこのようにパイプできるかどうかはわかり
ませんが、オーバーフローは1つも発生しませんでした。すなわち
printf "\r\n" > derp && perl -e 'print "n" . "A"x1025' >> derp && printf "\r\n" >> derp
cat derp | ./vuln
ここで、<->をtshに巻き戻します。私は、257文字の制限があると言いました。Enterキーを押してプログラムの操作を続行できるようにするには、それより1つ少なくする必要がありました。したがって、おそらく\ r \ nはここにありません。これは、2文字です。それかあなたはcat
このようなプログラムに参加することはできません。しかし、私はCプログラムで\ r \ nを使用して、脆弱なプログラムにEnterキーを押したことを伝えています。手動で貼り付けるのと同じ方法でバッファをオーバーフローさせることはありませんが、少なくとも穏やかに機能します(実際にはそうではありません)。ゴミ箱バッファ。
ARGh !!!
また、どちらか一方だけを使用すると、「\r」または「\n」は間違いなく機能しませんでした。私が見逃している別のコントロール文字はありますか?そして、これが私のプログラムの問題の1つである可能性はありますか?
しかし、基本的に私の全体的な問題は、実行してコマンドライン実行可能ファイルとインターフェイスするプログラムを作成する方法を理解できず、ちょっと言ってしまうことです!!! このバッファ全体をgets()に入れてください、私はあなたが本当にそれを好きになることを知っています!! 自分でターミナルからプログラムを実行している場合と同じように。
そして、16進コードを手動で端末に貼り付ける/書き込む方法がないことを私は知っています、それが理由ですなぜ私はCでhextバイトの文字列を作成し、そのプログラムのgets()に送信する相互作用プログラムを作成しようとしているのですか!!!! この段落にジャンプした場合は、257文字以上を手動で入力できるように/ bin /bashとsttyrawを具体的に使用していることも知っておいてください(正常に作成できる場合は、これを続行する必要があるかどうかはわかりません)脆弱なプログラムにバッファを送信するための相互作用するプログラム。おそらく、その方法でバッファを送信すると、tchの端末257文字の制限がバイパスされます)
誰か助けてくれませんか!?!?!?!?!