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;
}