2016-07-13 5 views
0
void cpy(char* b) { 
    char values[1024]; 
    strcpy(b, values); 
    fprint(values); 
} 

int main(int argc, char** argv){ 
    if(argc == 1 || strlen(argv[1]) > 1024) { 
     fprint("Nope!\n"); 
     return 1; 
} 
    cpy(argv[1]); 
    return 0; 
} 

なぜこのコードはバッファオーバーフローに対して脆弱ですか?私はそれは "strcpy"の部分とは関係があると思うが、私は確信していない...このコードはなぜバッファオーバーフローに対して脆弱ですか?

アイデア?

+0

fprintとは何ですか? –

+2

私はこのサイトであなたの宿題を投稿することをお勧めします。あなたが宿題の中で少なくとも不思議なことに材料を理解していない場合は、「A」を得るでしょう。最終試験で最終的に「F」をどのように説明しますか? –

答えて

2

短編小説:strcpyの引数が切り替わります。

ロングストーリーstrcpy第2から第1の引数までのコピー。

簡単に分析しましょう。 mainでは、コードではargv[1]が1023 + 1(NULバイト)文字以下であることを確認します。 argv[1]は、cpyに最初の唯一の引数として渡され、bとして利用可能です。

cpyには、valuesという文字の初期化されていない配列もあります。これは1024文字の長さに割り当てられています。

strcpyvaluesからbにコピーするように指示されています。私たちが知っているように、bargv[1]から得られたポインタなので、最大1024文字のスペースがあります。 valuesは1024文字に予約されていますが、初期化されていません。したがって、これらの1024文字にNULバイトが含まれる場合と含まれない場合があります。

境界がargv[1]に達する前にNULバイトが含まれていると、すべて正常です。そうでない場合は、二つのことが起こることができます:正確に1023文字の長さで

  • argv[1]場合(NULバイトを終了+)、範囲外の(values上で)読み込んで起こります(argv[1]に)書き込みます。 argv[1]未満1023の文字長い場合

  • は、argv[1]が起こるに範囲外の書き込み、および拡張によっても範囲外が発生する可能性があり、プログラムが境界の書き込みのうちに生き残った場合、valuesに読み込みます。

fprintの種類(私のシステムにはマンページはありません)によっては、コードに他の問題がある可能性があります。

+0

オハイオ州参照してください。配列 "values"は常に "b"より1つの位置で初期化されるべきですか?または、より良い選択肢がありますか? –

+0

完全にあなたが達成したいことに依存します。それが立っているコードはどちらの意味もあまり意味がありません。たぶんあなたはコードが何をすべきか説明することができます。 –

0

私はあなたの配列の終わりをマークする演算子がないので、あなたはcharの配列を使うと思います。

0

問題はfprintであり、文字列がいつ終了するかはわかりません。 '\ 0'で終わるはずです。だから、1024バイトをすべてセットして何かをあなたの配列に書き出すならば。 fprintコマンドはメモリから読み出して '\ 0'が存在するかどうかをチェックします。終了マークが見つかるまで読み取り続けます。

関連する問題