関する記事ですおすすめ書籍|組込みエンジニア向けEmacsC言語で作成した実行可能ファイルのシンボル情報を削除|情報漏洩を防ごう2018-12-04スポンサーリンク業務などでC/C++言語で作ったプログラム(実行可能ファイル)をリリースしたり他の人に渡すことがあると思います。その時にシンボル情報というものに気をつけていますでしょうか?シンボル情報というのは関数名とか変数名などの情報です。デバッガなんかで変数の値をのぞいたり、特定の関数まで実行したりできますよね。それは実行可能ファイルにシンボル情報があるからできるわけです。どこにどんな変数や関数があるかラベルづけされているわけですね。このように実行可能ファイルにはシンボル情報が含まれているんですが、場合によってはこれが情報漏洩の原因になりかねません。デバッグ用の関数や変数や隠し機能などが漏れてしまう可能性があります。ビルドした時のパス情報なども含まれるためにユーザ名なんかもわかってしまうかもです。そこで今回は、実行可能ファイルからシンボル情報をみる方法を示したうえで、それを削除する方法を示します。コマンドを使用します。上で実行していますが、Linuxでも同様です。ためしに自前でビルドした実行可能ファイルに対してnmを実行したところ、下記のようになりました。左の数字はアドレス、真ん中はデータの種類、右はシンボル名です。なんとなくたくさんのデータや関数があるんだなぁ、というのがわかるかなと思います。このように、nmでシンボル情報を表示することで、関数名やファイル名が簡単に見ることができてしまいます。fcloseスポンサーリンクさらに実行可能ファイルの中身をのぞいてみようnmでも色々な情報が見ることができますが、さらにもっと情報が見れないか試してみましょう。いうコマンドが便利です。これは指定したファイルから4文字以上の繋がったASCII文字を抽出するコマンドです。バイナリファイルから4文字以上のASCII文字を片っ端から表示するわけですね。こんな感じにひたすらにASCII文字が表示されていきます。mode..textP`.data.rdata`@.pdata0@.xdata0@.bss.idata.CRT.tls.rsrcB/19B/31B/45B/57例えばビルドした人を知りたければ、stringsの結果をgrepに渡してあげればわかる可能性があります。下記の例はMINGW(Windows)なのでパスの形式がC:で始まっています。Linuxの場合は適宜そこを置き換えてください。「C:\Users\username\work\tmp\ccache-3.5」というようにビルドした時のパスがあります。ところでユーザ名が判別できてしまいます。uniqC:/Programs/msys64/mingw64/etcC:/Programs/msys64/mingw64/includeC:/Programs/msys64/mingw64/x86_64-w64-mingw32/includeC:\Users\username\work\tmp\ccache-3.5C:\repo\mingw-w64-crt-git\src\crt-x86_64-w64-mingw32このようにして、割と簡単にいろんな情報を抜き出せてしまいます。悪用できてしまいそうですね。スポンサーリンクシンボル情報を削除するではどう対処すればいいか。不要なシンボル情報を削除すればOKですね。stripというコマンドがそれを実現してくれます。実行可能ファイルを渡せばいいだけです。./ccache.exeこうすると、nmコマンドを実行しても下記のように「シンボルが見つかりません」という旨のメッセージが表示されます。シンボル情報の削除に成功していますね。symbolsstringsについては、さすがに全てのASCII文字を削除するわけにはいかないので、多少は残ります。printfで表示するメッセージなんか削除されたら困りますし。先ほどみたようなビルドパスは削除されます。これで余計なシンボル情報が削除できていることが確認できましたね。スポンサーリンクまとめ今回は実行可能ファイルに含まれているシンボル情報による漏洩の危険性と、その削除の仕方について述べました。シンボル情報スポンサーリンクシェアするTwitterはてブ3Pocket2しんやさんをフォローする2スポンサーリンクしんやさん組込みエンジニアの思うところ関連記事C/C++超便利!C言語のアセンブラ出力を即確認できるサイト|compiler-explorerWeb上ですぐにC言語をアセンブラ出力してくれるサイトcompiler-explorerの紹介です。License)の紹介です。ただでさ複雑怪奇なC++の使用を「不必要なまでに」解説してくれている本です。GitHub上に公開されています。腕に自信のあるC++は、ぜひご一読下さいませ。alignasC/C++にてアライメントされた領域を確保する方法の説明です。ついてコード例を挙げて説明しています。組込みソフト向けC言語コーディング規約、関数編です。関数の定義と宣言の違いや、関数を作るときの定石を書いています。各ルールの理由と、違反例&適合例のソースコード例をまじえて説明しています。2016-12-14C/C++超便利!C/C++他30種類のプログラムをその場で実行確認できるサイト|Wandbox今回はWandboxという便利サイトの紹介です。その場でプログラムの実行結果を確認できるサイトで、多くの言語(30以上!)に対応しています!2017-04-04C/C++組込みソフト向けC言語コーディング規約|型の定義(構造体、列挙型、ビットフィールドなど)組込みソフト向けC言語コーディング規約、型の定義編です。ビットフィールドはびっくりするような仕様なので是非読んでください。.so)やオブジェクトファイル(.o)からシンボル情報を削除すると、リンクできなくなってしまうので要注意です!リンカはシンボル情報を参照してそれらを結合するので消してはダメです!Linuxだと別なのかもしれませんが、stripされているライブラリは普通にあります。手元のUbuntu18.04内にある標準ライブラリもstripされていましたよ。08:15情報ありがとうございます。システム標準のライブラリは、ちゃんと不要なシンボルだけ削除してるんでしょうね。08:20>システム標準のライブラリは、ちゃんと不要なシンボルだけ削除してるんでしょうね。一応自作ライブラリや自分でビルドした標準ライブラリに対してstripコマンドを利用しても同様の結果になります(strippedになるけどリンク出来る状態)。stripコマンド実装が不要なシンボルだけ削除してくれるようになっているって話かもしれませんね。リンクできる環境とできない環境とがあるんですね。下記のオプションをつけるのが確実そうですね。ご指摘ありがとうございました!!–strip-unneededリロケーション処理に不必要なシンボルを全て削除する。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。Desktop2019-02-012019-02-01Twitterのツイートを一括全削除!|転職活動時には一応やっておこう!2017-08-182019-06-11Excelで「はこのマシンでは利用できないため、オブジェクトを読み込めませんでした」が出た時の対処法2017-03-132018-04-19英単語暗記アプリAnkiにて英単語をGUIを使わずにエディタで登録する方法2018-10-122018-10-13おすすめ書籍|組込みエンジニア向け2018-04-022019-12-24スポンサーリンクこのブログを書いている人しんやさん組込みエンジニアとして12年くらい働いてます。