2016-10-20 14 views
0

CTFの場合、単純なバッファオーバーフローに対して脆弱なWinSockアプリケーションをビルドしようとしていますが、少なくとも私にとってはmemcpyの動作が非常に奇妙です。ビジュアルスタジオのすべてのセキュリティ対策が無効になっています。C++ Strange memcpyの動作

char recvbuf[1024]; 
char sendbuf[300]; 
int recvbuflen=1024; 
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); 
memcpy(sendbuf, recvbuf, recvbuflen); 
if (iResult > 0) { 
    printf("Bytes received: %d\n", iResult); 

    // Echo the buffer back to the sender 
    iSendResult = send(ClientSocket, sendbuf,sizeof(sendbuf) , 0); 

    ......... 

上記のコードスニペットからわかるように、これは受け取ったバイトで返信する非常に単純なアプリケーションです。今私はmemcpyの動作に関する2つの質問があります:

  1. これはなぜバッファオーバーフローを引き起こさないのですか?それは私が300文字長いバッファに1024文字長いバッファをコピーしようとしているようだ。 char *を使って同じことをしようとすると、バッファオーバーフローが発生します。

  2. iSendResult = send(ClientSocket、sendbuf、sizeof(sendbuf)、0); サイズをiResultに変更すると(これは受信バイト数の合計です)、アプリケーションは受け取ったすべての文字で正しく応答しますが、sendbufを300文字だけ送信するように選択しました。残りの文字はどこで取得できますかfrom(何らかの種類の一時バッファ?)

これらは私が説明する方法がわからない2つの動作です。 誰かが誰かがこの上にいくつかの光を当てることができれば素晴らしいだろう。

よろしくお願いいたします。

+3

[*未定義の動作*](http://en.cppreference.com/w/cpp/language/ub)には動作するように表示されます。あなたが 'sendbuf'をオーバーフローしたときに、あなたが実際に使用している' recvbuf'の部分に実際に書き戻していることを推測します。これは非常に悪いです。 – BoBTFish

答えて

2

バッファがあふれています。 何が起こると思いますか?バッファオーバーフローは、未定義の動作の場合です。このような非常にシンプルなプログラムでは、定義されていない動作はうまく動作する習慣があります。それは未定義の振る舞いをとても狡猾にするものです。

プログラムが実行されると、sendbufに300バイトを書き込み、残りのバイトはにあるsendbufの後に続くに書き込みます。私の推測では、recvbuflenには300から304までのバイトが含まれていると思われます。char unused[1024] = {0}の後にsendbufの後に新しい変数を追加すると、memcpyの後にその内容を調べることによってバイトがどこに書き込まれているか見ることができます。

+0

実際にchar [1024]の後にchar [300]を定義したので、メモリ上のchar [1024]の上にプッシュされ、char [1024]の大きな部分を実際にオーバーラップします。 – yannickwe87