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つの質問があります:
これはなぜバッファオーバーフローを引き起こさないのですか?それは私が300文字長いバッファに1024文字長いバッファをコピーしようとしているようだ。 char *を使って同じことをしようとすると、バッファオーバーフローが発生します。
iSendResult = send(ClientSocket、sendbuf、sizeof(sendbuf)、0); サイズをiResultに変更すると(これは受信バイト数の合計です)、アプリケーションは受け取ったすべての文字で正しく応答しますが、sendbufを300文字だけ送信するように選択しました。残りの文字はどこで取得できますかfrom(何らかの種類の一時バッファ?)
これらは私が説明する方法がわからない2つの動作です。 誰かが誰かがこの上にいくつかの光を当てることができれば素晴らしいだろう。
よろしくお願いいたします。
[*未定義の動作*](http://en.cppreference.com/w/cpp/language/ub)には動作するように表示されます。あなたが 'sendbuf'をオーバーフローしたときに、あなたが実際に使用している' recvbuf'の部分に実際に書き戻していることを推測します。これは非常に悪いです。 – BoBTFish