• ベストアンサー

バッファオーバーランについて

C言語のプログラミングファイルを読み込んで、バッファオーバーランの危険性を検出するプログラムを作りたいのですが、どうしたら良いか分かりません。 どなたかご教授お願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.2

gccにmudflapオプションつけてコンパイルすると、とりあえず検出できます。 あくまでも自分でそういうプログラムを作りたいのであれば、gccはオープンソースですから いろいろ参考に自分で作ればいいと思います。 動的解析でもよければValgrindのソースとかも参考になると思います。 ただし、ありふれたプログラマ程度のレベルでは作成は難しいのではないかと思いますが…。 腕に覚えがあるのであれば、ぜひ挑戦してみてください。 mudflapオプションについてはここが詳しいです。 http://d.hatena.ne.jp/hshinoda/20090330/1238398164 もし学校の宿題とかでしたら、scanfとかstrcpyなどのバッファオーバーランを 引き起こす恐れのある関数を検出するだけで先生はOKくれそうな気がします。

tnk48
質問者

お礼

回答ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.4

参照URLのIPAのサイトにバッファオーバーランの原因や解説、そのサンプルのソースリストもありますので、ここが参考になるでしょう。 でも理解するにはCだけでなく、CPUやレジスタなど機械語(アセンブラ)の知識も必要だと思います。

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_01.html
tnk48
質問者

お礼

回答ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

C言語の仕様の把握と コンパイラを作れるくらいの知識は身につけた方がよいかと。

tnk48
質問者

お礼

回答ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。
  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

c言語のインタープリタをでも作って、仮想メモリ空間でエミュレートしてみれば?

tnk48
質問者

お礼

回答ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バッファーのオーバーラン

    「このアプリケーションで、スタック ベースのバッファーのオーバーランが検出されました。このオーバーランにより、悪質なユーザーがこのアプリケーションを制御できるようになる可能性があります。」 というポップアップが出て、OK(だけしかなかった)を押したところ、画面が真っ白になった後しばらくしてデスクトップ画面に戻りました。 このアプリケーションというのがよくわかりません。そのポップアップが出たときはちょうど、使用後ウィンドウを閉じて電源を切らず数十分放置していたノートPCをシャットダウンしようとしていた時でした。ですから何もアプリは稼働していないのですが、アプリケーション=PC本体という意味なのでしょうか。 いずれにしても、身に覚えもなく検索してもよくわからないため少し怖いです。今もそのPCで質問しているため動作に問題があるわけではないのですが、何かしたほうがいいのでしょうか? PCについて詳しくないため、小さな不調が度々あるのですが、こんなことは初めてです。

  • バッファについて。

    C言語使われているバッファとはどういう意味でしょうか?stdio.hとファイル名のところで出てきました。教えていただけると助かります。すみません。

  • バッファを消したいのですが・・

    Cではバッファを消すために fflsuh(stdin) とすればできたいのですが、 C++ではどのようにバッファを消せばよいのでしょうか? ご教授のほどよろしくお願いします。

  • バッファとは何ですか

    C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか メモリとは違うものですか 訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません 一時的でない使い方も多い気がしますが実際はどういうものですか

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • バッファオーバーフロー攻撃について

    こんにちは 以下は、バッファオーバーフロー攻撃の引用です まず攻撃の第一段階として、ターゲットの環境上で脆弱性を発動させる必要があります。 具体的には、脆弱性を含むプログラム箇所まで処理を進めさせる。 次に、脆弱性の原因となっているバッファを処理するコード部分に、バッファを溢れさせるためのデータを渡す という記事を読んだのですが、どうやって「ターゲットの環境上で」処理するのでしょうか どうやって「プログラム箇所まで処理を進めさせる」のでしょうか どうやって「データを渡す」のでしょうか つまり、どんなコードを書くのでしょうか C 言語でお願いします プログラマーではないのでピンとこないのです よろしくお願いします

  • ダブルバッファ法を教えて下さい

    通信系のプログラムを作っているのですが、まったく分からなくて困っています。二つのメモリを確保し、まずバッファAが受信します。バッファAがいっぱいになるとバッファAはHDDに書き込みその間にバッファBで受信を行います。バッファBがいっぱいになるとHDDに書き込み、その間にバッファAが受信する・・・という風なサイクルでプログラムを動かしたいのですが、よろしくお願いします。C・C++で書かれたソースプログラムを下さい。

  • C言語、リングバッファについて

    C言語で、リングバッファを使ってデバックをしたいのですが、どうやったらよいかまったくわかりません。教えてください。よろしくお願いいたします。

  • C言語以外ならバッファオーバーフローは起きないのでしょうか?

    こんにちわ 私はつい最近プログラミング入門したばかりのものです。 いろいろな興味に実力がついていけずとんちんかんな状態です。 ところで、昨今のセキュリティ問題でよく登場するバッファーオーバーフローという ものは何だろう、と思っていろいろ自分なりに調べてみました。 ある説明文では、C言語のメモリー格納仕様に起因する問題、と書かれていました。 ・・・ということは、パスカルなどのような他の言語であれば、バッファーオーバー フローの心配はしなくてもいいことになるでしょうか? マック愛好家の間では、MacOSの安全性の高さを大変にアピールしていますが、これは 技術的に言うとMacがPascal言語で開発されていたから、という種明かし、と考えれば よいことになりますでしょうか? お暇な方がいらしてましたら、どうかおつきあい頂けましたら幸いです。

  • Buffer overrun detected!

    Microsoft Visual C++ Runtime Library Buffer overrun detected! Program: C:\WINDOWS\Explore.exe A buffer overrun has been detected which has corrupted the program's internal state. The program cannot safely continue execution and must now be terminated エクスプローラを開くたびに、こうでるのですが、どうしたらいいのでしょうか・・・PCに詳しくないのでご存知の方お願いします。