1

次の形式から、ネットワーク経由で構造体を受け取る C\C++ コードがあります。

struct DataStruct
{
int DataLen;
BYTE* Data;
}

私が持っているコードは、時間Dataのループで実行されDataLen、データを処理します。

...問題:

コードが侵入テストのためにセキュリティの専門家に渡された後、彼らはこの構造体をDataLen実際の長さよりも長いData. もちろん、これによりアクセス違反の例外が発生します。

問題は、受信した の実際の長さを検証するにはどうすればよいかということDataです。構造を変えなくても可能ですか?

前もって感謝します。

4

4 に答える 4

4

素敵なセキュリティ専門家!私の会社にもそんな部署があればいいのに。

ネットワークからデータが受信されるたびに、ネットワーク IO は、read(2)recv(2)、またはboost::asio::async_read私が見た他のものを使用したかどうかにかかわらず、実際にバッファーに書き込まれたバイト数を報告します。データ構造のヘッダーに「フォローするバイト数」フィールドがある場合の典型的な使用例は、そのバイト数が受信されるまで (またはエラーが発生するまで) read/recv/etc を繰り返し呼び出すことです。 DataStruct を返します (またはエラーを報告します)。

于 2010-08-31T12:30:54.930 に答える
2

受信したバイト数はわかっているので、 と比較してくださいDataLen

于 2010-08-31T12:26:49.937 に答える
1

構造を変えないと無理です。TCP/IP ソケットから受信したデータはプレーン ストリームです。論理的には、パケットに分割されません。物理パケットには 1 つ以上の DataStruct インスタンスを含めることができ、1 つの DataStruct インスタンスを 2 つ以上の物理パケットに分割できます。現在の情報構造体は、通信エラーまたは無効なパケットがない場合にのみ使用できます。

于 2010-08-31T12:33:03.743 に答える
0

本質的な制限がなければ、腐敗は簡単です。

いくつかの保護メカニズムは次のとおりです。

  • realloc()ある程度の許容サイズ内でバッファーを試してください(Data動的な場合)
  • 例外友達です: in を使用しSIGSEGVsignal(2)いくつかの便利なtry/catchコード構造を実行します。このトピックの簡単な紹介については、setjmp()/longjmp() とシグナル処理の組み合わせを参照してください。(誤ったアドレスを取得することにより) 深く掘り下げるために使用します。signal(7)setjmp(2)sigaction(2)
于 2010-09-02T21:55:48.120 に答える