問題タブ [stack-smash]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
637 参照

c - スタックを破壊する example3 ala Aleph One

Linux x86_64で楽しみと利益のためにスタックを破壊するの例 3 を再現しました。ただし、命令をスキップするために戻りアドレスにインクリメントする必要がある正しいバイト数を理解するのに問題があります。

x = 1そこに指示があると思います。私は次のように書いています。

gdbで逆アセンブルしました。-fno-stack-protectorアドレスのランダム化を無効にし、オプションを指定してプログラムをコンパイルしました。

質問1

以下の逆アセンブラーの出力から、アドレスの命令をスキップしたいことがわかります0x0000000000400595。戻りアドレスcallq <fn>movl命令のアドレスの両方です。したがって、戻りアドレスが0x0000000000400595で、次の命令が の場合、戻りアドレス0x000000000040059cに 7 バイト追加する必要がありますか?

質問2

戻りアドレスに 7 の代わりに 5 バイトを追加しても、同じ結果が得られることに気付きました。そうするとき、私は命令の途中に飛び込んでいません0x0000000000400595 <+35>: movl $0x1,-0x4(%rbp)か? その場合、リターン アドレスに 5 バイトまたは 7 バイトの代わりに 6 バイトを追加した場合のように、プログラムがクラッシュしないのはなぜですか。

質問 3

スタックの buffer1[] の直前は SFP で、その前に戻りアドレスがあります。つまり、4 バイトが buffer1[] の終わりを通過します。ただし、buffer1[] は実際には 2 ワードなので、8 バイトの長さになることに注意してください。したがって、戻りアドレスは buffer1[] の先頭から 12 バイトです。

Aleph 1 の例では、リターン アドレスのオフセットを buffer1[] の先頭から 12 バイトとして計算します。私は x86_32 ではなく x86_64 を使用しているため、戻りアドレスへのオフセットを再計算する必要があります。x86_64 の場合、buffer1[] はまだ 2 ワード、つまり 16 バイトです。SFP と戻りアドレスはそれぞれ 8 バイト (64 ビットを使用しているため) であるため、戻りアドレスは次のとおりbuf1 + (8 * 2) + 8ですbuf1 + 24

0 投票する
0 に答える
88 参照

c - カーネル空間での関数戻りのシミュレート

命令ポイント ( regs->ip) をロード可能なカーネル モジュール (Linux 3.13 用) の関数の戻りアドレスに設定しようとしています。ただし、stack smashing検出をスローします。私の質問は、それを回避する方法です。

より具体的には、カーネル モジュールに命令ポイントを設定する前のユーザー ランド プロセスのスタックは次のようになります。

カーネル モジュールはip(命令ポイント) を の戻りアドレスに設定しbarます。これは明らかにスタック オーバーフローです...

fooそこで、カーネルモジュールでのリターンをシミュレートできれば、エラーが発生ipしないように設定できるかどうかを考えていsmashing detectedます。

まず、この推測は正しいですか?つまりfoo、カーネル空間での復帰をシミュレートすることで、barスマッシングを検出せずに復帰できますか?

第二に、それが正しければ、それをカーネル空間に実装する方法は?

更新: 言及すべき興味深い (または未定義の) 動作:bar関数は次のようになります。

aデータが入力されたり、後で参照されたりすることはありません。宣言を削除するsmashingと、なくなります。それ以外の場合はそのままです。end of bar()(ところで、私は印刷物で見ることができます)。

0 投票する
1 に答える
481 参照

stack-overflow - スタック スマッシュにシェルコードを挿入する際のセグメンテーション エラー

スタック オーバーフロー攻撃がどのように機能するかを理解しようとしています。これまでのところ、戻りアドレスを元のコード内の命令に正常にリダイレクトできます。アセンブリでシェルコードランチャーを作成し、ac プログラム内で動作させました。gdb を使用したデバッグで、シェルコード ランチャーを表す 16 進数を取得し、c プログラムは正常に動作しました。しかし、この 16 進文字列を別のプログラムに挿入しようとすると、セグメンテーション エラーが発生します。戻りアドレスをトレースすると、プログラムが終了する前に 16 進文字列を指すように正常に設定されていることがわかりました。スナップショットは手順を示しています。同じコードがアセンブリでシェルを作成でき、メイン関数の戻りアドレスが sc (新しいシェルを作成する文字列) を指すように設定されているという事実を考えると、インジェクションが機能しない理由を理解できません。

アセンブリを含む上記の c コードをコンパイルして実行すると、完全に正常に実行されます。gdb を使用して上記の c プログラムの asm コードの 16 進数を取得し、次のスタック スマッシュ コードを生成しました。

コードを実行すると、次のエラーが発生します。プログラム受信信号 SIGSEGV、セグメンテーション違反。0x0804a01c in sc ()

0 投票する
1 に答える
159 参照

c - __interceptor_strchr は何をしますか?

このマシン命令の直後に関数がクラッシュします(スタックオーバーランが原因です):

何をし__interceptor_strchr(char const*, int)ますか?

0 投票する
1 に答える
3324 参照

c - スタックベースのバッファ オーバーフロー - 入力が制限された scanf を使用した C での課題

セキュリティ CS コースの一環として、私のクラスは脆弱性を悪用して、スタック/バッファ オーバーフローを使用してパスワード チェックを無効にするタスクを与えられました。脆弱性のあるコードは次のとおりです。

私は古典的な「スタックスマッシング」の原則を理解しています (私はそう思います)。またcorrect_hash、プロンプトが表示されたときに 15 文字を超えるパスワードを入力すると、配列の最初の 14 バイトが上書きされる、明らかなオーバーフローの脆弱性があります。memcmpただし、これを活用してチェックを通過させ、チャレンジを完了する方法がわかりません。私が発見した/試みたもののいくつか:

  • を使用してハッシュさpasswordれるため、同等の設定はcorrect_hash機能しません(いずれにせよ、2 つを等しく設定することは不可能です。これは、使用可能な 30 個のスペースに 1 つの一意の ASCII文字を正確に挿入するためです。つまり、2 つの配列が同等になることは決してありません。 .文字は (私の知る限り) 文字列の途中に挿入することはできません)。passwordMD5()scanfNULNULscanf

  • 最大バイト数をscanf(常に文字を追加するNUL) で上書きすると、 の最後の 3 バイトcorrect_hashは常に になります0x00 0x91 0xebstrlen(password)16 文字のパスワードをランダムに生成して、これらの最後の 3 バイト/文字 (MD5 を使用すれば計算上はかなり簡単) にハッシュ化しようとしてもうまくいきません。への呼び出しで、文字をヒットしたときに長さのカウントを終了するだけなので、16 のような便利なものではなく、29の. これは、期待される出力を生成するために 16 文字のパスワードをハッシュする代わりに、 の呼び出しが から16 文字をハッシュし、その後に から 13 文字が続くことを意味しますNULMD5()MD5()passwordcorrect_hash、異なる最終ハッシュ値を生成します。

    • この問題を回避するには、S の最初の 16 文字が、S の最後の 13 文字で構成される文字列 R にハッシュされ、その後に0x00 0x91 0xeb. ランダムな MD5 ハッシュ計算でこれを見つけることがどれほど実行可能かはわかりませんが、私の可能性は高くありません。

いくつかの注意事項 (上記の説明で言及):

  • scanfは 29 文字の文字列に制限されていますが、ASCIINUL文字が追加され、合計 30 文字 (配列から 16 文字、password配列から 14文字correct_hash) を上書きできます。

  • ASCIINUL文字は を介し​​て入力できないscanfため、(最大パスワード長が使用されている場合)strlen(password)への呼び出しでは 29 になります。MD5()

ここでの質問は、他にどうすればこれを行うことができるでしょうか? 非常に明白な何かが欠けていますか?ランダム生成は実行可能な解決策ですか、それとも唯一の解決策ですか?

解決策は、バッファ オーバーフローを使用する必要があり (それ以外の場合は、常に 0 を返す preload a のようなことを実行できると思いmemcmpます)、シェル スクリプトとして実行可能である必要があります (関連する場合)。