参考文献:
「ハッカー攻撃と防衛技術コレクション - 戦闘システム」
「アセンブリ言語」
1に、我々はすでに、スタックの明確な理解を持って、このセクションでは、スタックオーバーフローから、以下の点を説明します
1)スタックオーバーフロー
2)制御EIP
3)権限を取得するために、脆弱性を利用して
非実行スタック上4)勝利
I.スタックバッファオーバーフロー
このセクションの後、我々はデータバッファにあまり見て、バッファは、これらの変化の理解に、何が起こるかである、我々は業務の一部を示し行うには、バッファオーバーフローを使用することができます
まず、栗を見て:
する#include <stdio.hに> する#include <STDLIB.H> 空隙return_input(ボイド) { チャーアレイ[ 30 ]。 (配列)を取得します。 printf(" %sにする\ n"、アレイ) } ボイドメイン() { return_input()。 返します。 }
编译:
GCC -mpreferredスタック境界= 2 -g -oオーバーフローoverflow.c
警告が表示されます。
overflow.c:関数で'return_input': overflow.c:5:14警告:(/usr/include/stdio.h:638で宣言)は推奨されません'ます' [-Wdeprecated-宣言] (配列)を取得します。
ヒント機能が廃止され、いくつかの問題があり、ここでは通常の成功をコンパイルするには、この最初の懸念はありません
ここでは、プログラムを実行します。
ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss * **スタックスマッシング検出***:./overflowは終了 (核心已转储)放弃已を
そして、私たちは、この期間のため、小さな通常の調査の結果がエラーコア、なぜプロンプトオーバーフローがあるだろう期待して、コアはそれをダンプ????
チェック情報は、メッセージがGCCスタックオーバーフロー保護機構によって提供されていることを知って後に印刷メッセージバッファオーバーフローのプログラムの存在を検出します。私たちは、私は、Linuxシステムでは、コードのビットを走っ構築することができるようになりますと崩壊、そしてシステムがあまりにも脆弱で明らかであり、gccはそれが何であるスタックオーバーフロー保護メカニズムを提供しているではないだろうと、考えることができますか?
ビューGCCのマニュアルは、我々は、バッファオーバーフローの検出メカニズムによって提供されるオプションの範囲のgccの新聞-fstack-プロテクターのためのメカニズムを知ることができます。ここでは、この原理メカニズムは以下のとおりです。
-fstackプロテクターが有効になっている場合、それはバッファオーバーフロー(例えば、バッファオーバーフロー攻撃を)検出したときに、すぐに問題が検出され、その既存のバッファオーバーフローを促しているときに実行中のプログラムを終了します。このメカニズムは、簡単に完了するために、コンテキスト変数を追加し、保護の機能に目標に攻撃されているのです。これらの関数は、関数の使用を含み、(本明細書で同じバッファサイズの上記の例はメカニズムをトリガするために5である、非常に明確ではない)バッファサイズを超えたallcoa 8バイト機能します。これらの変数の保護関数の終了時に検出するために、初期化関数を入力するときに特定の変数のテストが失敗した場合、それはエラーメッセージを出力し、現在のプロセスを終了します。
、その機能が類似し-fstack-プロテクターですが、スタックオーバーフローの検出を実行するために、すべての機能だったので、私たちは、このオプションを追加することができるように最高の時間をコンパイルしている:それもあると解釈され-fstack-プロテクター-allオプションを提供し、システムの問題を避けます
自宅に近いほど、私たちはなぜ迅速な情報のオーバーフローを見て?
私たちは、GDBの解体を見て
1 (GDB)逆アセンブルreturn_input 2のアセンブラコードのダンプ機能return_input: 3 0x00000000004005ed <+ 0 > :プッシュ%のRBP 4 0x00000000004005ee <+ 1 > :MOV%のRSPは、%RBP 5 0x00000000004005f1 <+ 4 >: サブ $ 0x30を、% RSP 6 0x00000000004005f5 <+ 8 > :MOV%FS:の0x28、%RAX 7 0x00000000004005fe <+ 17 >:のMOV%のRAX、 - 0x8という(%のRBP) 8 0x0000000000400602 <+ 21 > 排他的論理和 %のEAX、%eaxに 9 0x0000000000400604 <+ 23 >:LEA - 0x30から(%のRBP)、%のRAX 10 0x0000000000400608 <+ 27 > :MOV%RAX、%RDI 11 0x000000000040060b <+ 30 >:callq 0x4004f0 <はPLT @取得> 12 0x0000000000400610 <+ 35 >:LEA - 0x30から(%のRBP)、%のRAX 13 0x0000000000400614 <+ 39 > :MOV%のRAX、%のRSI 14 0x0000000000400617 <+ 42 > :MOV $ 0x4006d4、%EDI 15 0x000000000040061c <+ 47 >:MOVの$ 0x0の、%のEAX 16 0x0000000000400621 <+ 52 >:callq 0x4004c0 <printfのPLT @> 17 0x0000000000400626 <+ 57 >:MOV - 0x8という(%のRBP)、%RAX 18 0x000000000040062a <+ 61 >: XOR %FS:の0x28 %のRAX 19 0x0000000000400633 <+ 70 >:JE 0x40063a <return_input + 77 > 20 0x0000000000400635 <+ 72 >:callq 0x4004b0 <__ stack_chk_fail PLT @> 21 0x000000000040063a <+ 77 > :leaveq 22 0x000000000040063b <+ 78> :retq 23アセンブラ・ダンプの終了を。
私たちは、3つの命令の呼び出しは<30> <52> <72>であることを確認することができ、最初の二つは、printf関数であり、取得します
私たちは、ブレークポイントを取得します何を見て()とretqを設定しますか?
継続するには。。