3

私の研究目的では、バッファオーバーフロー攻撃などのエラーが原因でプログラムが強制終了/クラッシュしたときに、オペレーティングシステムによってどのような変更が行われるかを確認したいと思います。

ここでシナリオ全体を説明しましょう。

アプリケーションが実行中であり、そのデータとコードがメモリ内にあるとします。攻撃者は、バッファオーバーフローの脆弱性を悪用してマシンにアクセスすることでアプリケーションを乗っ取ろうとしますが、システムはそれを検出し、悪用されているアプリケーションを強制終了します。ここで、プロセスを強制終了したときにオペレーティングシステムによってメモリに残された痕跡があるかどうか、およびそのプロセスを強制終了する前にOSが実行した必要な手順を確認したいと思います。

また、ACプログラムの実行時にメモリの変更をライブで追跡できるツールはありますか?また、メモリスナップショットデータを人間が読める言語(アセンブリコードなど)に逆コンパイルできますか?

編集::

次の例の場合

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


int main()
{

int x;
char arr[4];
char * src = "haha";

printf("Before copying\n");

scanf("%d", &x);
if(x> 1)
    strcpy(arr, src);
printf("%s \n", arr);
return 0;
}

バッファオーバーフローエラーが発生しています。チェックする前に、それはうまくいきます。1より大きいxを入力すると、プログラムがクラッシュします。このプログラムがクラッシュ/強制終了された場合でも、メモリに痕跡が残っているかどうかを確認したいと思います。

ありがとう。

4

2 に答える 2

5

攻撃がプログラムに致命的なエラーを引き起こさない限り、OS は通常、進行中のバッファ オーバーフローやその他の悪意のある攻撃を検出しません (たとえば、不良メモリへのアクセスや無効なアドレスへのジャンプなど)。その場合、OS は他のプロセス エラーと同じように状況を処理します。UNIX ライクなシステムでは、OS はプロセスがキャッチできる (通常は致命的な) シグナルをプロセスに送信します。

一部のアプリケーションは、スタック破壊プロテクタまたはその他の保護機能を使用してコンパイルされabort()、スタックが破損した場合 (プログラミング エラーまたは悪用されたバッファ オーバーフローを示す)、アプリケーションを自動的に (または終了する) 保護します。この場合、終了を試みるのはアプリケーション自体です。通常、これらのメカニズムは、無効になる可能性を最小限に抑えるために、できるだけ早くアプリケーションを終了する終了方法を使用します。

どちらの場合でも、プロセスが停止したと仮定すると、OS はそのプロセスを停止しているとマークし、CPU サイクルの提供を停止します。プロセスは「ゾンビ」として残る可能性があるため、その親はその終了コードを判別できますが (UNIX の場合)、以前に使用していたメモリは OS に解放されます。その後、OS は解放されたメモリを他のプロセスに渡すことができます。一部のシステムおよび構成では、プロセスが異常終了した場合にクリーンアップされる前にプロセスのコア ダンプを実行します。コア ダンプには、強制終了される前のプロセス メモリの内容が含まれており、開発者は終了の原因となったエラーの原因を特定できます。

于 2012-09-20T04:02:23.430 に答える
0

攻撃を検出して、犠牲になっているアプリケーションを強制終了できるシステムがあるとは思えません。何が起こるかというと、攻撃の結果として、プログラムはそれ自体に損害を与え、実行できなくなります。その時点で、オペレーティング システムはそれを終了します。

「攻撃」の比喩は誤解を招くものであり、力が関与していないからです。食べ過ぎて吐くようなものだけど、誰も食べさせてくれなかった。

プログラムが予期せず終了した場合、プログラムの最後の状態が保存されて分析できる場合がありますが、定期的に分析することはできません。

于 2012-09-20T04:05:45.627 に答える