-2

Linux 上の C/C++ で Heartbleed Bug の簡単な実装を作成しようとしています (vmplayer で ElementaryOS を使用)。ハートブリード バグについての私の理解では、クライアントがサーバーにハートビート リクエストを送信し、ペイロードの実際のサイズよりも大きなサイズのペイロードを指定する必要があります。レスポンスのローカル ペイロード バッファの後。

これまでのところ、クライアント/サーバー アプリケーションです。クライアントはサーバーに接続し、機密情報 (この場合はパスワード) を送信します。次に、クライアントはサーバーにハートビート要求を送信し、ペイロードのサイズが正しくないことを指定します。ローカル変数を次のように宣言します。

        char password[30];// = new char[30];    //Some sensitve data, that will be accessed using the Heartbleed Bug
        char temp[15];// = new char[15];
        char payload[45];// = new char[45];

次のように、ハートビート リクエストからコンテンツを取得します。

        int payloadSize = atoi(strtok(buffer, " "));
        temp = strtok(NULL, "\n");

ハートビート リクエストでは、ペイロードは「payload」で、サイズは 45 です。次に、次のように memcpy() を呼び出します。

        memcpy(payload, temp, payloadSize /* 45 in this case */);

ペイロード変数が値「ペイロード」を保持し、その後にパスワード変数の内容が続くことを期待しています。ただし、ペイロードは値「ペイロード」のみを保持します。

        cout<<payload<<endl; //prints payload

誰かが私が間違っていることを指摘できますか?

すべてのコード:

int main()
{
    ofstream log("ServerLog.txt");

    int listeningSocket = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in serverAddress, clientAddress;
    socklen_t clientLen;

    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = 54321;

    if(bind(listeningSocket, (sockaddr *) &serverAddress, sizeof(serverAddress)) < 0)
    {
        cout<<strerror(errno)<<endl;
    }

    else
    {
        cout<<"Socket bound to port 12345"<<endl;

        if(listen(listeningSocket, 5) < 0)
        {
            cout<<strerror(errno)<<endl;
        }

        else
        {
            log<<"Listening for connections now..."<<endl;
            int commSocket = accept(listeningSocket, (sockaddr *) &clientAddress, &clientLen);

            log<<"Now connected to a client..."<<endl;

            int N = 0;
            char buffer[100];// = new char[100];
            char password[30];// = new char[30];    //Some sensitve data, that will be accessed using the Heartbleed Bug
            char *temp = new char[15];
            char payload[45];// = new char[45];

            N = recv(commSocket, password, 100, 0);     //Receive sensitive data, in this case, a password

            if(N == 0)          //Check for remote socket close
            {
                cout<<"The remote connection has been closed."<<endl;
            }

            else if(N < 0)      //In case there is an error
            {
                cout<<strerror(errno)<<endl;
            }

            else        //All good, move on
            {
                //cout<<N<<" "<<password<<endl;
                log<<"Password received from client: "<<password<<" of length: "<<N<<endl;

                N = recv(commSocket, buffer, 100, 0);      //recv heartbeat request

                if(N == 0)          //Check for remote socket close
                {
                    cout<<"The remote connection has been closed."<<endl;
                }

                else if(N < 0)      //In case there is an error
                {
                    cout<<strerror(errno)<<endl;
                }

                else
                {
                    log<<"Heartbeat request received from client: "<<buffer<<endl;

                    int payloadSize = atoi(strtok(buffer, " "));
                    temp = strtok(NULL, "\n");

                    memcpy(payload, temp, 45);

                    if(N < 0)
                    {
                        cout<<strerror(errno)<<endl;
                    }
                }
            }
        }
    }

    return 0;
}
4

2 に答える 2

0

使い方strtokが間違っています。のコンテキストでバッファポインタを最後に移動したため、がint payloadSize = atoi(strtok(buffer, " "));得られる場合payloadSizeは何もありませtempん。temp = strtok(NULL, "\n");strtok

memcpyの前に一時的なものを確認してください

于 2015-06-01T21:17:39.697 に答える