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 を用いて、実行ファイルのアセンブラコードを閲覧しました。

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

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

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

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

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア