質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1908閲覧

SSLサーバーがアクセスを受けた時のメモリの中身を見たい

dsf185

総合スコア3

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/06/21 04:29

編集2020/06/21 07:04

前提・実現したいこと

自作した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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/21 05:32

そもそもなにをしたくてそういうことをするんでしょうか
dsf185

2020/06/21 06:38

サーバーがSSL通信のリクエストを受けてから,サーバー秘密鍵がメモリ上に置かれるまでにプログラムが要求するメモリページ数を把握することを目的にしています. なので,SSLハンドシェイクを行う過程でのメモリの中身を見て,自分で作成した秘密鍵がどこに置かれているかを探りたいと考えています.
y_waiwai

2020/06/21 06:40

ならそれを質問しましょう。 ふわふわした要件で質問しても、ふわふわした回答しか帰りませんよ
dsf185

2020/06/21 06:53

ご指摘ありがとうございます.質問内容を修正しておきます.
guest

回答1

0

ベストアンサー

gdbで動作中のSSLサーバープログラムへattachしている状態ではサーバーへアクセスできませんでした....

もっと単純なプログラムでgdbの使い方を試して慣れておいた方が良いです。

attachして停止状態にあれば、(そもそも処理が止まっているので)当然サーバはアクセスを受け付けられません。
そうすると、「attachしているけど動作状態にしておいて、アクセスを受け付けた後に停止」という状態を作り出さないといけません。
なので、「受け付けた後のタイミングで実施される処理」を狙ってブレークポイントを設定したり、クライアント側で接続後に待ちを作って、そこでgdbで割り込む必要があります。
※後者の場合、例えば gdb起動→プログラム開始→クライアントで接続(opensslのs_clientコマンド等)、通信データの授受はしないで待っておく→gdb上でプログラム停止(Ctrl-C) のような手順が考えられます

投稿2020/06/21 06:37

angel_p_57

総合スコア1672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dsf185

2020/06/21 07:32

attachするとプログラムは停止状態になるのですね...gdbの使い方を勉強したいと思います. 具体的な例を示してくださり,とても参考になりました. ありがとうございます.
dsf185

2020/06/22 14:28

例示していただいた手順でgdbを使用してプログラムを実行する場合,gdbによってプログラムが要求するメモリの量やその中身を知る方法はあるのでしょうか.
angel_p_57

2020/06/22 15:20

> gdbによってプログラムが要求するメモリの量やその中身を知る方法はあるのでしょうか. 「プログラムが要求するメモリの量」というのが何を想定されているのか分かりませんが、プログラムがOSから割り当てを受けているメモリ空間情報を見るコマンドは用意されています。( "info proc maps" ) で、割り当てを受けている空間内のアドレスを指定して保存されているデータを見ることもできます。Cのポインタ参照めいた "*アドレス"を print コマンドに指定するか、或いは x コマンドで一定のメモリ領域をダンプしたりですね。 ただ当然のことながら、変数名を元に値を調べた方が楽ですが。( シンボリックデバッガなので )
dsf185

2020/06/23 08:32

ありがとうございます.参考にさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問