前提・実現したいこと
自作したSSLサーバープログラムがSSL通信のリクエストを受けてから,サーバー秘密鍵がメモリ上に置かれるまでにプログラムが要求するメモリページ数を把握しようとしています.SSLハンドシェイクを行う過程でのメモリの中身を見て,自分で作成した秘密鍵がどこに置かれているかを探る手段を模索しています.
Linux上で動作するプログラムが確保するメモリの量やその中身をリアルタイムで取得する方法はあるのでしょうか?
試したこと
gdbを使ってメモリダンプを取得しようとしましたが,gdbで動作中のSSLサーバープログラムへattachしている状態ではサーバーへアクセスできませんでした....
簡易SSLサーバーのソースコード
参考までに載せておきます.SSLの実装にはOpenSSLを利用しました.
C++
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <unistd.h> 5#include <sys/socket.h> 6#include <arpa/inet.h> 7#include <iostream> 8 9#include <openssl/ssl.h> 10#include <openssl/err.h> 11#include <openssl/crypto.h> 12#include <openssl/x509.h> 13 14int main() { 15 SSL_CTX *ctx; 16 SSL *ssl; 17 18 int ret; 19 int server, client, sd; 20 int port = 1234; 21 const char crt_file[] = "./ssl/server.crt"; 22 const char key_file[] = "./ssl/server.key"; 23 24 struct sockaddr_in addr; 25 socklen_t size = sizeof(struct sockaddr_in); 26 27 char buf[1024]; 28 29 char body[] = "Hello World"; 30 char header[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 11\r\nConnection: keep-alive\r\n"; 31 char msg[1024]; 32 33 SSL_load_error_strings(); 34 SSL_library_init(); 35 OpenSSL_add_all_algorithms(); 36 37 ctx = SSL_CTX_new(TLS_server_method()); 38 SSL_CTX_use_certificate_file(ctx, crt_file, SSL_FILETYPE_PEM); 39 SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM); 40 41 server = socket(PF_INET, SOCK_STREAM, 0); 42 bzero(&addr, sizeof(addr)); 43 addr.sin_family = AF_INET; 44 addr.sin_addr.s_addr = INADDR_ANY; 45 addr.sin_port = htons(port); 46 47 bind(server, (struct sockaddr*)&addr, sizeof(addr)); 48 listen(server, 10); 49 50 while(1) { 51 client = accept(server, (struct sockaddr*)&addr, &size); 52 53 ssl = SSL_new(ctx); 54 SSL_set_fd(ssl, client); 55 56 if (SSL_accept(ssl) > 0) { 57 SSL_read(ssl, buf, sizeof(buf)); 58 snprintf(msg, sizeof(msg), "%s\r\n%s", header, body); 59 SSL_write(ssl, msg, strlen(msg)); 60 } 61 62 sd = SSL_get_fd(ssl); 63 SSL_free(ssl); 64 close(sd); 65 } 66 67 close(server); 68 SSL_CTX_free(ctx); 69 70 return EXIT_SUCCESS; 71}
回答1件
あなたの回答
tips
プレビュー