2011-12-23 7 views
3

私は、動的に割り当てられたメモリの上書きによるエラーをキャッチする、新しいメモリ上書きテストツールを設計して、コード化する作業を行っています。メモリ上書き検出ツールの設計

ユーザがxバイトを要求した場合は、x + rバイトを割り当ててください。です。 mprotectを使用すると、rバイトにアクセスすることができません。そのため、ユーザープログラムがその部分に実行されると、SIGSEGVを生成して停止します。

しかし、上記の場合に問題であるが、mprotectは、マップされたメモリ(mmap)とx + Rバイトをマッピングmalloc要求オーバーヘッドが実質的に存在しているすべての時間を要します。

他の方法をお勧めしますか?このようなツールを使っていれば、コードスニペットを使うことができますか?

P .:誰でも、知っているか、使っているオープンソースツールの設計ドキュメントを共有できますか?

+0

あなたはエフェンスを書き直しているようなサウンドを、おそらくあなたはどのようにして見てみたいですか? – PlasmaHH

+0

@PlasmaHH:私が上記の手順をエフェンスで使用しています。膨大なメモリオーバーヘッドがあります。だから、それを書き直しても意味がない。 – kingsmasher1

+2

valgrind? http://valgrind.org/docs/manual/mc-manual.html – rve

答えて

2

1つの方法は、より多くのメモリを割り当て、前後の特定のバイトパターンで埋め込むことです。ユーザーデータはこれらの赤いゾーンの間にあります。割り当てを解除すると、赤いゾーンのパターンが元の状態になっているかどうかを確認します。 Identifying Memory Management Bugs Within Applications Using the libumem Libraryにより詳細に説明されています。

+0

「As」でいっぱいになり、最後の上書きが同じ文字であるとしますか?ユニークなフィラーは何ですか? – kingsmasher1

+0

例えば0xdeadbeefで埋めてください。同じ値のバイトを上書きする確率は1/256、4バイトの場合は1/256^4です。 –

+0

同時に、あなたが言及した手順は確実に書き込みを防ぎます、メモリ読み取りはどうですか?メモリがその場所で読み取ろうとしたのかどうかは検出されません。 – kingsmasher1

1

オープンソース製品ではありませんが、technical paperは、C言語用にCheckPointerをどのように実装したかをかなり詳しく説明しています。 CheckPointerはValgrindが検出しないエラーを検出します。

C++のために同じことを行うには読者の練習として残して: - {

+0

ありがとう、この便利なリンクのためのupvote。私はそれをチェックし、混乱の場合にあなたに戻ってみましょう。 – kingsmasher1

0

あなたがMPROTECTを使用したい場合は、ページ単位で動作する必要があります。
ユーザがxバイトを必要とすると仮定すると、x < = 4K(x> 4Kとするとそれはちょっと複雑です)と仮定します。
mmap(整列したページを表示)を使用して8Kを割り当て、mprotectを使用して2番目のページを書込み保護します。
ユーザーに戻るときに、最初のページへのポインタをp + 3096-xに渡さないでください。
これで、彼は正確にxバイトのアクセスが可能になり、後で書き込みしようとするとクラッシュします。

+0

そして、彼が "前"に書き込もうとするとどうなりますか?Cプログラムもポインタデクリメントでいっぱいです。 –

+0

@IraBaxterでは、データの後にデータを書き込む(ページの最後にデータを書き込む)か、データの前に書き込む(先頭にデータを書き込む)のどちらかを検出します。設定可能にして、2つのテストを実行できます。あるいは、各割り当てごとにランダムに決定することもできます。 – ugoren

関連する問題