7

パスワードが必要な単純なプログラムでバッファオーバーフロー(Linuxを使用しています)を実行しようとしていました。プログラムコードは次のとおりです。

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

int check_authentication(char *password){

int auth_flag = 0;
char password_buffer[16];

strcpy(password_buffer, password);

if(strcmp(password_buffer, "pass1") == 0)
    auth_flag = 1;
if(strcmp(password_buffer, "pass2") == 0)
    auth_flag = 1;

return auth_flag;

}

int main(int argc, char **argv)
{

if(argc < 2){

    printf("\t[!] Correct usage: %s <password>\n", argv[0]);
    exit(0);

}

if(check_authentication(argv[1])){

    printf("\n-=-=-=-=-=-=-=-=\n");
    printf("  Access granted.\n");
    printf("-=-=-=-=-=-=-=-=\n");

} else {

    printf("\nAccess Denied.\n");

}


   return 0;

}

OK、エラーなしでコンパイルし、overflow.c として保存しました。

ターミナルを開き、ファイル ディレクトリ (デスクトップ) に移動して、次のように記述しました。

./overflow.c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

ターミナルは、「スタック破壊が検出されました」(またはそのようなもの)と言ってから、プログラムの実行を終了しました。

今、ジョン・エリクソンの『ハッキング - 搾取の術』という本を読んでいます。章の中で、彼はこのタイプのエクスプロイトを説明し (私は本からコードを引用しました)、私が実行したのと同じコマンドを実行します。メモリがオーバーフローし、プログラムは「アクセス許可」を出力します。では、なぜ私の OS は私がプログラムを悪用しようとしていることを検出しているのでしょうか? 私は何か間違ったことをしましたか?

Mac OS X でもエクスプロイトを試しましたが、同じことが起こりました。誰か助けてくれませんか?前もって感謝します。

4

4 に答える 4

10

最新の Linux ディストリビューションでは、バッファ オーバーフローが検出され、プロセスが強制終了されます。そのモードを無効にするには、次のようなフラグ (gcc) を使用してアプリケーションをコンパイルするだけです。

-fno-stack-protector -fno-stack-protector-all

于 2013-01-03T17:43:45.850 に答える
3

gcc でコンパイルする場合は、-fno-stack-protectorフラグを追加します。あなたが受け取ったメッセージは、あなたの悪いコードからあなたを守るためのものです:)

于 2013-01-03T17:45:30.007 に答える
1

その理由は、スタック破壊が実際には一部のコンパイラでバッファ オーバーフロー攻撃を検出するために使用される保護メカニズムであるためです。29 個の A を短い文字配列 (16 バイト) に入れようとしています。

于 2013-01-03T17:46:48.500 に答える
0

最近のほとんどの OS には、保護メカニズムが組み込まれています。ほとんどの優れた OS では、プログラムへの直接的な低レベル メモリ アクセスが許可されていません。プログラムは、割り当てられたアドレス空間にのみアクセスできます。Linux ベースの OS は、割り当てられたメモリ領域を超えてアクセスしようとするプロセスを自動的に強制終了します。

これ以外にも、OS には、OS が使用できるリソースを大幅に使い果たそうとして、プログラムが大量のメモリを割り当ててシステムをクラッシュさせないようにする保護メカニズムもあります。

于 2013-01-03T17:44:54.997 に答える