何かが許可されていないことを確認したい場合は、コードをコンパイルし、リンク先を調べます(nm
など)。 "プログラム的"な方法でこれをやっているので、python/perl/bashを使ってコンパイルし、オブジェクトファイルの名前リストをスキャンしてください。
静的に定義されたバッファのバッファオーバーライトについては、あまりできませんが、動的に割り当てられたバッファオーバーランを防ぐために、電気フェンスタイプのメモリアロケータにリンクすることができます。
問題のCファイルをvalgrindで実行中に一般的なデータを提供するドライバとコンパイルしてリンクすることもできます。これは悪質または悪意のあるコードの検出に役立ちます。
しかし、最終的には、「このルーチンは終了しますか?」という質問に対しては、常に決心しています。これは決めることができないことで有名です。これを実践する方法は、あなたのプログラムをコンパイルし、適切な時間の一定期間後にalarm
-outとなるドライバから実行することです。
EDIT:nm
の使用を示す例:
#include <stdio.h>
foo() {
FILE *fp = fopen("/etc/passwd", "r");
}
-c
でコンパイルし、次いで得られたオブジェクト・ファイルを見:
fopen
を呼び出し定義関数foo
をスニペットCを作成します
$ gcc -c foo.c
$ nm foo.o
0000000000000000 T foo
U fopen
ここで、yオブジェクトファイルfoo.o
に2つのシンボルがあることがわかります。 1つは定義されている、foo
、私たちが書いたサブルーチンの名前。1つは定義されていません。fopen
は、オブジェクトファイルが他のCファイルと必要なライブラリとリンクされているときにその定義にリンクされます。このメソッドを使用すると、コンパイルされたオブジェクトが独自の定義の外にあるものを参照していて、ルールによって「悪い」と考えられるかどうかをすぐに確認できます。
まあ、 '#include'ディレクティブをチェックして、ヘッダーの「ホワイトリスト」以外のものが含まれているかどうかを調べることができます。 –
スタティックコード解析。あなたの禁止された機能や許可されていない#includeを調べるだけです。もし何かホワイトリストを作成し、whitelistに含まれていないものがあるかどうかを確認するには、math.h、関数呼び出しがローカルになければなりませんファイル関数またはmath.h関数などで... –
"有害な"を定義します。 –