1. HOME
  2. ブログ
  3. IT技術
  4. C言語とgdbを用いたデコンパイルでバーナム暗号を復号化する

C言語とgdbを用いたデコンパイルでバーナム暗号を復号化する

デコンパイルの説明

近年、サイバー犯罪などが増加し、個人・企業ともに、常にセキュリティインシデントに陥る危険性を持っています。

セキュリティインシデント
コンピュータの利用や情報管理、情報システム運用に関して保安上の脅威となること

しかし、セキュリティの人材は、ほとんど全ての業界で不足していると言われています。

そのため、エンジニアであれば、専門家でなくとも、社内のセキュリティの担当をする可能性があります。

そこで今回は、セキュリティ解析の中でも様々な知識を必要とする「デコンパイル」について説明します。

デコンパイルとは?

コンパイルを行うと、実行可能ファイルが生成されます。

実行可能ファイルからは、通常の方法ではソースコードを参照することができません。

「デコンパイル」とは、その実行可能ファイルから、内部のメモリ情報を参考にすることで、元々のソースコードを再現することです。

デコンパイルの活用法

「デコンパイル」には、以下のような活用法があります。

  1. 実行ファイルが悪意をもったものか判断する
  2. 自らのファイルをデコンパイルされにくくすることで、模倣への対策を行う

それでは、実際に「デコンパイル」の手順を見てみましょう。

こちらの記事もオススメ!

注意事項

今回は、以下の記事で使用した CpawCTF の問題を利用します。

なお、CTF の問題がなくても、デコンパイルの手順がわかるように記述しています。

注意点

  1. デコンパイルした結果から模倣したソフトを配布することは、法律に反します。
    (CTFなどのデコンパイルされることを想定されているものは除く)
  2. 今回のコードは、 Windows10 と CentOS7 で動作確認を行っています。
  3. Windows10では、Visual Studio 2019 を利用してコンパイルします。
  4. CentOS7 では、ターミナルから gcc を用いてコマンドラインでコンパイルします。
  5. 情報は、2020年5月7日現在のものです。
  6. 今回紹介されている問題を CpawCTF で解くには、level1, level2 までのすべての問題を解いておく必要があります。

デコンパイルを行う

Q23.[Reversing]またやらかした!

200pt

またprintf()をし忘れたプログラムが見つかった。
とある暗号を解くプログラムらしい…
reversing2000

問題

問題は、以下のページを参照してください。

(level1、level2 の問題を見てからアクセスしてください)

【CpawCTF】
https://ctf.cpaw.site/questions.php?qnum=23

実行環境

今回の説明では、Linux 環境での操作を前提に説明します。

なお、ファイルをデコンパイルするときは、端末に悪影響がないように仮想環境を利用することをお勧めします。

プログラムを実行してみる

「rev200」は実行ファイルですが、実行しても何も起きません。

しかし、本当に何もしないプログラムなのでしょうか。

デコンパイル実行

gdb コマンドを用いて、中のメモリを閲覧してみましょう。

これでメイン関数が実行されます。

実行結果

以下のような結果になると思います。

問題をダウンロードできない場合は、こちらのデコンパイル結果を参照してください。

コメント文に、実際にどのようなことが行われているか書いています。

結果解析

35 行目を例に、読み解き方を見てみましょう。

先頭から「レジスタ上の位置」「命令」「対象となる変数など」を表しています。

「命令」の部分は、「アセンブラ言語」という機械語とプログラミング言語の中間のような言語で書かれています。

読み解いてみる

<+141> から <+168> までがループです。

ebx-0x80 から配列を逆順に、 0x19 という値と排他的論理和を取り続けています。

4 ずつデクリメントしているのは、初めの配列の定義で数字がメモリを占有する量を加味して、4 ずつずらして代入しているからです。

大事な箇所は

解析では、危険な命令が実行されている箇所に注意して、確認する必要があります。

特に大切なのは、排他的論理和をとっている xor と、比較を行っている cmp の部分です。

C 言語で結果を再現してみる

解析結果を参考に、C 言語でこの結果を再現してみます。

C言語で再現したコード

もとのプログラムにはなかった、配列の中を表示する機能を追加しています。

最初の配列の値

実行をしても、私たちには表示機能があるものしか見ることができません。

初めの配列の中身を表示すると、以下のようになります。

排他的論理和をとると

最初の値について、排他的論理和をとった後の値を表示すると、以下のような結果になりました。

暗号化方式 Vernam

このプログラムでは、何をしていたのか分かりましたか?

答えは、全ての文字を一定の値と排他的論理和を取る「バーナム(Vernam)暗号」という暗号化です。

この暗号化方式の特徴は、もう一度、同じ値と排他的論理和をとれば元の値に戻る、という点です。

他の暗号化方式と組み合わせて使われることの多い、暗号化方式です。

さいごに

いかがでしたでしょうか。

今回は gdb を用いて、実行ファイルのアセンブラコードを閲覧しました。

そして、その中にあったバーナム暗号のプログラムを再現してみました。

実行した見かけだけではわからない機能が、ファイルに隠されていることはよくあります。

特に、悪意のあるファイルには注意しましょう。

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
システム開発依頼・お見積もりはこちらまでお願いします。
また、WEB・アプリ系エンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

こちらの記事もオススメ!

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事