0

プログラムが argv[1] 引数として中間に null ターミネータを持つ文字列を受け取るとどうなりますか? 例えば:

./program test'\0'example

argv[1] の値は? テストですか?テスト\0例ですか? これらのコード行があります

max = sizeof(filename);
len = strlen(argv[1]);
if (len > max) goto error;
strcpy(filename, argv[1]);

このプログラムのエクスプロイトを構築する必要があり、私がやりたかったことは、argv[1] をテストする価値があるようにすることです'\0'例, argv[1])=strcpy(filename, "test") なので、残りの文字列 (例の部分) を使用してエクスプロイトを配置できます。出来ますか?どうもありがとうございます?

4

3 に答える 3

1

argv[1]型のポインタですchar*。その値はアドレスであり、文字列ではありません。具体的には、その値は、値が であるcharオブジェクトのアドレスです't'

C 標準 (セクション 7.1.1) には、次の定義があります。

文字は、最初の null 文字で終了し、最初の null 文字を含む連続した一連の文字です。
[...]文字列へ
のポインターは、最初の (アドレス指定が最も低い) 文字へのポインターです。文字列の長さはヌル文字の前のバイト数であり、文字列の値は含まれている文字の値のシーケンスです。

連続する文字シーケンスの最初の文字を指しているためargv[1]、そのうちの 1 つがヌル文字であるため、文字列へのポインタです。その文字列の値は "test" (終端の を含む'\0') で、文字列の長さは 4 です。

の値が であると、一種の口頭で簡略化して言うのが一般的ですargv[1]"test"、それは不正確です -- *es

argv[1]また、文字配列の最初の文字を指します。その配列の最初の 5 バイトには文字列が含まれます"test"。配列全体に文字値が含まれています。

{ 't', 'e', 's', 't',
  '\0',
  'e', 'x', 'a', 'm', 'p', 'l', 'e',
  '\0' }

の値をargv[1]文字列関数に渡すと、その関数は のみを参照"test"し、終端の を超えるものにはアクセスしません'\0'memcpy配列の残りの内容はまだ完全に有効であり、文字列を操作するだけではない関数 ( など) を使用してアクセスできます。

一種の口頭での省略形として、 の値はargv[1]is"test"であると言うのが一般的ですが、それは不正確です。特に、文字列の値とその文字列を含む配列の値の違いが重要なこのような場合には。

これらの特定の内容を持つ配列の最初の要素を指すような方法でメイン プログラムを呼び出すことができるかどうかargv[1]は、オペレーティング システムに依存する別の問題です。

于 2014-05-07T18:20:00.060 に答える
0

の値は、リテラル文字やだけでなく、実際に端末で実際の NULL 文字を取得できたと仮定するargv[1]と、 になります。"test"\0

RedAlert のコメントが述べたようにstrlenstrcpyどちらもヌル文字で停止するため、ヌル文字を取得してもほとんどのエクスプロイトには役立ちません。

おそらく、キャラクターを使用せずにエクスプロイトを行う方法を見つける必要があります\0

于 2014-05-07T17:57:20.237 に答える