TSALVIA技術メモ

CTFのWriteupや気になったツールについて書いていきます。また、このサイトはGoogle Analyticsを利用しています。

SECCON 令和CTF Writeup

SECCON 令和CTF について

平成最後のCTFとして、http://score-reiwa.seccon.jp/が開催されました。
平成31年4月30日(火)23:00(JST)~令和元年5月1日(水)01:00 (JST) (2時間)
※ 開始直後にサーバトラブルがあり、結局2時まで開催されていました。

2018.seccon.jp

私もいろいろ準備して参加しましたが、 結局チュートリアルも含めて、4問しか解くことができませんでした。 結果は、310点で78/858位でした。

f:id:tsalvia:20190501113258p:plain

SECCON 令和CTF Writeup(4問)

Misc フラグの例は?

平成最後の最後、令和最初のSECCON CTFにようこそ。 フラグはSECCON{reiwa}です。

Misc bREInWAck

問題

元号が変わる。記号も変わる。
参考: https://ja.wikipedia.org/wiki/Brainfuck

添付ファイル(flag.bw)

令和和和和和和和和和和和和和和和和「令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成」令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。

解答例

令和平成「」。 の文字をBrainfuckの記号( >+<-[]. )に置き換えて、 Brainfuckインタプリタで実行するとフラグが取得できます。

cat flag.bw |
sed -e 's/令/>/g' |
sed -e 's/和/+/g' |
sed -e 's/平/</g' |
sed -e 's/成/-/g' |
sed -e 's/「/[/g' |
sed -e 's/」/]/g' |
sed -e 's/。/./g'

変換すると、下記のようになります。

$ sh reiwa_ctf_misc2.sh
>++++++++++++++++[>+
++++>++++>+++++++>++
++++>++<<<<<-]>+++.>
+++++.--..<----.-.>>
+++++++++++.>++.<<<+
+++.>++.++++.>>+++++
+++++++.<<<+++++++++
++++.--------.>-----
---.>>.-----.------.
>+.<<++.>>>+++++++++
+.

今回は、下記のBrainfuckインタプリタを使用しました。

copy.sh

f:id:tsalvia:20190501112847p:plain

Misc 零は?

問題

nc zerois-o-reiwa.seccon.jp 23615

解答例

netcatで接続すると、計算問題が表示されます。
右辺の計算結果が0になるような?を見つけていく問題のようです。

$ nc zerois-o-reiwa.seccon.jp 23615
[1/100]
0=71-?
?=71
[2/100]
0=91*71-?
?=

後半になると問題も長くなり、タイムアウト時間もあるので手動では解けそうにありません。 今回は、Pythonを使って100問解くようにプログラムを書きました。

  1. pwntoolsで接続して、問題を取得する。
  2. ?を総当たりで割り当てて、evalで計算する。
  3. 計算結果が0になったら、回答する。
  4. 上記を繰り返す。
from pwn import *

p = remote('zerois-o-reiwa.seccon.jp', 23615)

for count in range(100):
    print '--- ' + str(count) + ' ---'

    # get question
    p.readuntil('0=')
    question = p.readuntil('?=').split('\n')[0]
    print question

    # brute force
    answer = 0
    while True:
        tmp = question
        result = eval(tmp.replace('?', str(answer)))
        if result == 0:
            break
        answer += 1

    # send answer
    p.sendline(str(answer));
    print '?=' + str(answer)

p.interactive()

実行すると、下記のようになります。

$ python reiwa_ctf_misc3.py
[+] Opening connection to zerois-o-reiwa.seccon.jp on port 23615: Done
--- 0 ---
?-43
?=43
--- 1 ---
60+23-?
?=83

(省略)

--- 98 ---
71-92+76*30*15+56-84*68+47-65-10+79*10*61+27-94*40+34-1+36*96-29-71*73+25*89+91-52*62-52+33-6*43+9*8+62-22-45+36*13-18+52*60+16-59*57-63+83*65*64-85+48+6*56-32+57*29-74-88*90+58-42+7*86*52+58-25-57*18+22+98*90-97+89-69*29*8+51-97-63*67+20+19-54*95*18+19-52+89*55-13*33+80-54-77+?*0+39-92-340391
?=0
--- 99 ---
55+56*0-68+32-47*78*59+59-85+45-71*73+91*90-21*25+93-15+98-27*82*99+49-48+77*73-78*80+44-13*89-67+24-60+14*31-97*75+87+30*88-33-23*28+19*35-93+29*30-22+71+75*65-33+56*54-20+59-68*81-54+9*32+16-50*5*80-34+75*15-40+51+31-90*43*18-57+46+99-59*19-80+93*89*24-33+97-39*89+40-99*72+72-14+67*88+0*?-10+330814
?=0
[*] Switching to interactive mode
Congratulations!
The flag is SECCON{REIWA_is_not_ZERO_IS}.
(Enter RETURN key if connection is not disconnected)
[*] Got EOF while reading in interactive
$

Forensic 新元号発表

問題

newera.pdfを開くと下記の画像が表示されます。

f:id:tsalvia:20190501103333p:plain

解答例

PDFをよく見ると、QRコードが隠れているように見えます。 下記のサービスを使用してPDFから画像を抽出してみました。
smallpdf.com

抽出すると、2つの画像を取得することができました。

f:id:tsalvia:20190501104229j:plain

f:id:tsalvia:20190501110248j:plain

後は適当に重ねてQRコードを読み込むとフラグが取得できます。 私は、PowerPointの機能で白を透過させて2つの画像を重ねました。

www.becoolusers.com

実際にQRコードを重ねてみると、以下のようになります。

f:id:tsalvia:20190501104125p:plain

Ghidraの使い方(調査まとめ)

はじめに

しばらくGhidraについて調べていたので、見つけた機能をいろいろ紹介していきます。 インストール方法やプロジェクトの共有については、別の記事を参考にしてください。

tsalvia.hatenablog.com tsalvia.hatenablog.com

公式サイトからチートシートも用意されているので、こちらも参考になります。
Ghidra Cheat Sheet

f:id:tsalvia:20190401001401p:plain

検証環境

下記の環境で検証を行いました。

  • Windows 10 バージョン 1809
  • OpenJDK 11.02
  • Ghidra v9.0.2

解析用のサンプルプログラム

紹介するにあたって、解析サンプルとなるようなプログラムを用意しました。 このプログラムをベースに説明していきます。 正しいパスワードを入力したら、flagが取得できるようなCTF形式の簡単なプログラムを用意しました。

  • 実行例
$ ./HelloGhidra
Usage: ./HelloGhidra <password>
$ ./HelloGhidra aaaaaaaa
Incorrect password.
$ ./HelloGhidra Hello_Ghidra!
Congratulations! flag{Hello_Ghidra!}
$ gcc -o HelloGhidra HelloGhidra.c
$ strip ./HelloGhidra

Ghidraの機能紹介

ウィンドウのレイアウト変更

各ウィンドウの青いバーをドラッグアンドドロップすることで、レイアウトを自由に変更できる。

  • f:id:tsalvia:20190331193302p:plainで別ウィンドウで表示する。
  • f:id:tsalvia:20190331193421p:plainで間に挿入する。
  • f:id:tsalvia:20190331193500p:plainでウィンドウを重ねる。

https://i.gyazo.com/9279cc57778d902cacb150775b426e10.gif

アセンブラ表示のレイアウト変更

Listingウィンドウのレイアウトは、細かく修正することができます。

Listingウィンドウの右上のf:id:tsalvia:20190331225234p:plainをクリックすると、レイアウト編集モードに入れます。

https://i.gyazo.com/bd5941a6e4ee99a8bd88369d0f1bfd18.gif

スタックの深さを表示する

  1. Listingウィンドウの右上のf:id:tsalvia:20190331225234p:plainをクリックすると、レイアウト編集モードに入ります。
  2. 「挿入したい場所を右クリック」→「Add Field」→「Stack Depth」をクリックする。

f:id:tsalvia:20190331232606p:plain

  1. 左端に「Stack Depth」が追加されました。

f:id:tsalvia:20190331233301p:plain

コードグラフの表示

「Window」→「Function Graph」もしくはf:id:tsalvia:20190331233829p:plainをクリックすると表示されます。

f:id:tsalvia:20190331233809p:plain

スナップショットの作成

現在見ている場所をスナップショットとして別ウィンドウに保持することができます。

各ウィンドウの右上にあるf:id:tsalvia:20190331235834p:plainをクリックすると、スナップショットを作成することができます。

https://i.gyazo.com/cfb56e9d20218bc986ffdd3fc706508d.gif

関数名や型の書換え

関数名や返り値の型などを修正することができます。

「関数名を右クリック」→「Edit Function Signature」で編集ウィンドウが表示されます。

f:id:tsalvia:20190331194916p:plain

  • 変更前 f:id:tsalvia:20190331195058p:plain

  • 変更後 f:id:tsalvia:20190331195326p:plain f:id:tsalvia:20190331195358p:plain

変数名の変更

ループカウンタ変数である「local_c」を「i」に書き換えてみます。
「変数(local_c)を右クリックする」→「Rename Variable」で変更できます。

f:id:tsalvia:20190331205544p:plain

f:id:tsalvia:20190331205437p:plain

  • 変更前 f:id:tsalvia:20190331204922p:plain

  • 変更後 f:id:tsalvia:20190331205218p:plain

数値の表示形式を変更する(例:16進数→10進数)

「Listingウィンドウの数値を右クリックする」→「Convert」で様々な形式に変換できます。

f:id:tsalvia:20190331210350p:plain

Listingウィンドウで変換した内容は、Decompileウィンドウにも反映されます。 f:id:tsalvia:20190331210551p:plain

文字列の検索(Defined Strings)

「Window」→「Defined Strings」で表示できます。

f:id:tsalvia:20190331200313p:plain

文字列の参照先にジャンプする

  1. 「対象の文字列をダブルクリック」すると、文字列が格納されている場所にジャンプします。
  2. 「ジャンプ先の文字列を右クリック」→「References」→「Show References to Address」をクリックする。
  3. 参照先のアドレス一覧が表示されるので、ジャンプしたい項目をダブルクリックする。

https://i.gyazo.com/69c7d7828ae86dee2311fc25792f4da1.gif

オーバービューやエントロピーの表示

「どこに何が格納されているのか」や「どういう形式なのか」を色で確認することができます。

Listingウィンドウの右上にある「Toggles overview margin displays.」をクリックする。 「Show Overview」や「Show Entropy」にチェックを入れる。

https://i.gyazo.com/ac7ffaee50edcb850a3eb14caa1570c7.gif

  • Overview
    f:id:tsalvia:20190331202507p:plain

  • Entropy
    f:id:tsalvia:20190331202538p:plain

マウスオーバーで参照先を表示する

関数名やラベルにマウスカーソルを当てると、参照先がどうなっているのかを確認することができます。

https://i.gyazo.com/afde6c9af0471f3a9cdc61696c599838.gif

マウスオーバー機能の無効化

Listingウィンドウの右上にあるf:id:tsalvia:20190331204258p:plainをクリックすると、 f:id:tsalvia:20190331204319p:plainに変わり、マウスオーバーで表示する機能を無効化できる。

関数呼び出しをツリーグラフで確認する

「Window」→「Function Call Graph」で表示できます。

f:id:tsalvia:20190331220808p:plain

コメントの挿入

  1. 「コメントを挿入したい個所を右クリック」→「Comments」→「Set Pre Comment...」をクリックします。 f:id:tsalvia:20190331213943p:plain

  2. コメント挿入用のウィンドウが表示されるのでコメントを書き込んで、「Apply」をクリックする。 f:id:tsalvia:20190331214053p:plain

  3. コメントは、DecompileウィンドウやListingウィンドウに反映されます。 f:id:tsalvia:20190331213816p:plain

バイナリ表示(Bytes)

「Window」→「Bytes」 もしくは f:id:tsalvia:20190331211359p:plainボタンをクリックすると表示されます。

f:id:tsalvia:20190331211626p:plain

アスキー文字列の表示

Bytesウィンドウの右上のf:id:tsalvia:20190331213046p:plainボタンをクリックし、 「Ascii」にチェックを入れる。

f:id:tsalvia:20190331212243p:plain

f:id:tsalvia:20190331213011p:plain

スクリプトマネージャ

Ghidraにはさまざまなスクリプトが用意されています。

「Window」→「Script Manager」もしくはf:id:tsalvia:20190331234633p:plainで開くことができます。

f:id:tsalvia:20190331234550p:plain

Script Managerの右上のf:id:tsalvia:20190331234838p:plainをクリックすると、ソースコードを表示することができます。

f:id:tsalvia:20190331234806p:plain

XOR変換(XorMemoryScript.java

  1. XOR変換したい個所を「Bytes」ウィンドウで指定する。 マウスでドラッグすると、緑色にハイライトされます。

f:id:tsalvia:20190331215142p:plain

  1. 「Script Manager」を開いて、「XorMemoryScript.java」にチェックを入れます。
  2. 「Run Script」ボタンを押すと、スクリプトが起動します。
  3. 今回は、0x15でxorされていることが、Decompile結果から分かっているので、「15」と入力します。

f:id:tsalvia:20190331215441p:plain

  1. 「OK」を押すと、ハイライトされた箇所が「]pyyzJR}|qgt4」から「Hello_Ghidra!」に変換されていることが分かります。

f:id:tsalvia:20190331215608p:plain

ダークモード

「Edit」→「Tool Options...」→「Tool」→「Use Inverted Colors」にチェックを入れる。
※ CodeBrowserではなく、プロジェクト管理のEditメニューから設定する。

f:id:tsalvia:20190331193904p:plain

f:id:tsalvia:20190331194038p:plain

参考にしたサイト

Ghidra プロジェクトの共有方法

はじめに

Ghidraには、プロジェクトの共有機能が実装されています。 複数人で解析する場合は、この機能を使うと便利です。 ちなみにIDA Proには、デフォルトでプロジェクト共有機能がありません。 IDArlingのようなプラグインを別途導入する必要があります。

Ghidraサーバの詳細については、<Ghidraのディレクトリ>/server/svrREADME.htmlを参照してください。

また、Ghidraのインストール方法は、こちらを確認してください。

プロジェクトの共有手順

プロジェクトの共有は、下記の手順で行えます。 各項目について説明していきます。

  1. Ghidraサーバをインストールする
  2. Ghidraサーバにアクセスできるユーザを追加する
  3. リポジトリとプロジェクトを作成する
  4. 解析したファイルをリポジトリに追加する
  5. 別のPCからリポジトリにアクセスする

検証した環境

今回は、LinuxDebian 9)環境で試しました。Windowsの場合は、「~.bat」を実行すれば同様の動作になるはずです。

$ uname -a
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3 (2019-02-02) x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.8 (stretch)
Release:    9.8
Codename:   stretch

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

1. Ghidra サーバをインストールする

プロジェクトを共有するためには、Ghidraサーバを立てる必要があります。

サーバのインストールは、<Ghidraのディレクトリ>/server/svrInstallで行えます。 これを実行すると、Ghidraサーバがインストールされ、サーバが起動します。出力の最後に「Service ghidraSvr started」と表示されれば成功です。

$ ./server/svrInstall 
alice password:
:
省略
:
Service ghidraSvr started

Ghidraサーバは、デフォルトで13100番ポートで待ち受けています。

$ ss -l | grep 13100
tcp    LISTEN     0      50      *:13100                 *:*

2. Ghidraサーバにアクセスできるユーザを追加する

Ghidraサーバが起動したら、次にユーザの追加を行います。 追加したユーザだけが、Gidoraサーバにアクセスすることができます。

ユーザの追加は、<Ghidraのディレクトリ>/server/svrAdmin で行えます。 デフォルトのパスワードは、「changeme」となっています。

$ ./svrAdmin -add <SID>

ユーザ追加例:

$ whoami
alice
$ sudo ./server/svrAdmin -add alice
Using server directory: /home/alice/ghidra_9.0/repositories
1 command(s) queued.

3. リポジトリとプロジェクトを作成する

  1. 「File」→「New Project...」から新しいプロジェクトを作成します。 今回は、プロジェクトを共有したいので「Shared Project」を選択して「Next >>」をクリックします。 f:id:tsalvia:20190315034546p:plain

  2. 「Server Name:」にGhidraサーバを立てたPCのIPアドレスもしくはドメイン名を指定して、「Next >>」をクリックします。 今回は、下記の通りに設定しました。

    • Server Name: → 「localhost
    • Port Number: → 「13100」(デフォルトのGidoraサーバのポート番号) f:id:tsalvia:20190315034739p:plain
  3. svrAdminで作成したユーザのパスワードを入力して「OK」をクリックします。 デフォルトパスワードは、「changeme」となっています。 f:id:tsalvia:20190315034820p:plain

  4. パスワードの変更を要求されるので、「OK」をクリックします。 f:id:tsalvia:20190315035030p:plain

  5. 新しいパスワードを入力して、「OK」をクリックします。 f:id:tsalvia:20190315035107p:plain

  6. パスワードの変更が完了しました。「OK」をクリックして次に進みます。 f:id:tsalvia:20190315035132p:plain

  7. リポジトリ名を指定して「Next >>」をクリックします。 今回は、「mySharedProject」という名前にしました。 f:id:tsalvia:20190315035253p:plain

  8. 共有プロジェクトにアクセスできるユーザを指定して、「Next >>」をクリックします。 今回の例では、「alice」というユーザしかいないので、「Admin」権限以外選択できません。 f:id:tsalvia:20190315035358p:plain

  9. 共有プロジェクトのローカルの保存先を指定して、「Finish」をクリックします。 今回は、下記の通りに設定しました。

    • Project Directory: → 「/home/alice/GhidraProjects」
    • Project Name: → 「mySharedProject」 f:id:tsalvia:20190315035501p:plain
  10. 「mySharedProject」という共有プロジェクトが作成できました。 f:id:tsalvia:20190315035549p:plain

4. 解析したファイルをリポジトリに追加する

  1. 「File」→「Import File...」で解析したいファイルをインポートする。 f:id:tsalvia:20190315035820p:plain

  2. インポートしたファイルを右クリックし、「Add to Version Control...」をクリックする。 f:id:tsalvia:20190315040016p:plain

  3. コメントの入力欄が出てくるので、コメントを書いて「OK」をクリックする。 f:id:tsalvia:20190315040132p:plain

  4. リポジトリにAddすると、ファイルのアイコンに緑のチェックマークが付きます。 上記の手順でリポジトリにAddしたファイルのみが共有されます。 f:id:tsalvia:20190315040206p:plain

5. 別のPCからリポジトリにアクセスする

アクセス権の割当て(ユーザ名か異なる場合のみ)

手順2で追加したユーザ以外を使ってGhidraサーバにアクセスしたい場合は、新たにユーザを追加する必要があります。

  1. Ghidraサーバを起動しているPCで「svrAdmin」を使用してユーザを追加します。 今回は、「bob」というユーザを追加しました。
$ sudo ./server/svrAdmin -add bob
Using server directory: /home/alice/ghidra_9.0/repositories
1 command(s) queued.
  1. 「Project」→「Edit Project Access List...」をクリックします。 f:id:tsalvia:20190315042058p:plain

  2. 「bob」を選択して「Add >>」をクリックします。 次に右にある「bob」の「Read/Write」チェックボックスにチェックを入れて、「OK」をクリックします。 f:id:tsalvia:20190315042223p:plain

上記の作業により、「bob」ユーザに読書き権限を割り当てることができました。

リポジトリにアクセスする

  1. 手順3と同様に新しいプロジェクトを作成します。 今回も「Shared Project」を選択します。

  2. 「Server Name:」にGhidraサーバのIPアドレスもしくはドメイン名を指定して、「Next >>」をクリックします。 今回は、下記の通りに設定しました。

    • Server Name: → 「172.16.0.2」(GhidraサーバのIPアドレス
    • Port Number: → 「13100」(デフォルトのGidoraサーバのポート番号)

f:id:tsalvia:20190315041331p:plain

  1. bobユーザでログインすると、リポジトリ選択画面に遷移します。
    手順3で作成したプロジェクト「mySharedProject」が確認できるので、選択して「Next >>」をクリックします。 f:id:tsalvia:20190315042417p:plain

  2. 手順3と同様にプロジェクトのローカルの保存先を指定して「Finish」をクリックします。

  3. 手順3で追加したファイルが共有されていることが分かります。 f:id:tsalvia:20190315042553p:plain

トラブルシューティング

サポートされているJavaランタイムが見つかりませんでした。

下記のようなエラーが出る場合は、support/launch.propertiesの JAVA_HOME_OVERRIDEプロパティにJDKディレクトリを指定してみてください。

Failed to find a supported Java runtime.  Please refer to the Ghidra Installation Guide's Troubleshooting section.
Failed to install Ghidra Server!

<Ghidraのディレクトリ>/support/launch.propertiesの JAVA_HOME_OVERRIDEプロパティ(5行目)の設定例

JAVA_HOME_OVERRIDE=/opt/java/jdk-11.0.2

ed: コマンドが見つかりません

下記のようなエラーが出る場合は、edコマンドをインストールしてください。

/home/analyst/ghidra_9.0/server/ghidraSvr: 行 85: ed: コマンドが見つかりません
ERROR: failed to install fork_hack in server.conf

インストール方法

$ sudo apt-get install ed

svrAdminでユーザの追加ができない

下記のようなエラーが出る場合は、root権限で実行できていません。

$ ./svrAdmin -add alice
Using server directory: /home/alice/ghidra_9.0/repositories
Invalid Ghidra server directory specified: /home/alice/ghidra_9.0/repositories

sudoを先頭につけてコマンドを実行してください。

$ sudo ./svrAdmin -add alice
Using server directory: /home/alice/ghidra_9.0/repositories
1 command(s) queued.

参考にしたサイト

Ghidra インストールガイド

Ghidraについて

2019年3月5日にNSAOSSリバースエンジニアリングツール「Ghidra(ギドラ)」を公開しました。 有料の「IDA Pro」と違い無料でデコンパイルまでしてくれるので、非常に魅力的なツールです。

news.mynavi.jp

今回は、Ghidra の公式サイトを参考にインストール手順を紹介します。 特に下記の2つが参考になりました。

他にも、Ghidraの使い方やプロジェクト共有機能などについてまとめていますので、こちらの記事も参考にしてください。

tsalvia.hatenablog.com

tsalvia.hatenablog.com

最小要件

  • ハードウェア

    • 4 GBのRAM
    • 1 GBの空き容量(Ghidraのインストール用)
    • (デュアルモニター推奨)
  • ソフトウェア

Ghidraのインストール

OpenJDK 11のインストール

  • Windows10の場合OpenJDK11のインストール方法メモ - Qiitaを参考)
    1. JDK Builds from Oracle にアクセスする。
    2. Windows/x64と書いてあるzipファイルをダウンロードする。
    3. ダウンロードしたzipファイルを展開する。
    4. C:\ProgramFiles\Java\ に展開したファイルを移動する。
    5. 環境変数を設定する。
      1. 下記の手順で設定画面を開く。
        「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数(N)...」
      2. ユーザ環境変数の「Path」を選択し、「編集」をクリックする。
      3. 「新規(N)」をクリックし、「C:\ProgramFiles\Java\jdk-11.0.2\bin」を指定する。
        ※ 環境に合わせてパスを変更してください。
      4. 「OK」を3回押して閉じる。


  • LinuxDebian 9)の場合
$ wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
$ tar xvf openjdk-11.0.2_linux-x64_bin.tar.gz
$ sudo mkdir /opt/java/
$ sudo mv jdk-11.0.2 /opt/java/
$ echo 'JAVA_HOME=/opt/java/jdk-11.0.2' >> ~/.bashrc
$ echo 'PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc

Ghidraのインストール

  1. Ghidra公式サイトにアクセスし、「Download Ghidra」からダウンロードする。

  2. ダウンロードしたzipファイルを展開する(7-Zipやunzipなど)。

※ Ghidraにインストーラはありません。好きな場所に保存してください。

Ghidraの起動

  1. Ghidraの起動用スクリプトを実行します。

    • Windowsの場合、ghidraRun.batを実行する。
    • Linuxの場合、ghidraRunを実行する。
  2. 利用規約が表示されるので、「I Agree」ボタンを押す。 f:id:tsalvia:20190313015242p:plain

  3. 「Ghidra: NO ACTIVE PROJECT」、「Ghidra Help」、「Tip of the Day」の3つのウインドウが表示される。 「Ghidra Help」と「Tip of the Day」は使わないので、閉じてください。 f:id:tsalvia:20190313015431p:plain

  4. 新しいプロジェクトを作成します。「File」→「New Project..」から作成できます。 f:id:tsalvia:20190313015524p:plain

  5. プロジェクトを共有するかどうかを選択します。今回は共有しないので、「Non-Shared Project」を選択して「Next >>」をクリックします。 f:id:tsalvia:20190313015630p:plain

  6. プロジェクトを管理するディレクトリとプロジェクト名を設定します。今回は、下記の通りに設定しました。

    • Project Directory →「/home/test/GhidraProjects」
      ※ この画面でディレクトリを新しく作成することができないので、あらかじめ作成しておいてください。
    • Project Name →「myProject」 f:id:tsalvia:20190313020309p:plain
  7. 「Finish」をクリックすると、プロジェクトが作成されます。 f:id:tsalvia:20190313022712p:plain

  8. f:id:tsalvia:20190313022758p:plainをクリックすると、「CodeBrowser」が起動します。ここで解析作業が行えます。 f:id:tsalvia:20190313020744p:plain

  9. 解析したいファイルをインポートします。「File」→「Import File...」からインポートできます。 f:id:tsalvia:20190313020824p:plain

  10. 解析したいファイルを選択します。今回は、サンプルとして下記のファイルをコンパイルしたものを指定しました。 gist.github.com f:id:tsalvia:20190313020859p:plain

  11. 「Format」や「Language」などを確認し、「OK」をクリックする。 f:id:tsalvia:20190313020924p:plain

  12. 解析するかどうかを聞かれるので、「Yes」をクリックします。 f:id:tsalvia:20190313020959p:plain

  13. 「Analyze」をクリックすると、解析が開始されます。 f:id:tsalvia:20190313021024p:plain

  14. 指定したファイルのサマリも表示されています。「OK」をクリックすると、閉じることができます。 f:id:tsalvia:20190313021047p:plain

  15. このように逆アセンブルデコンパイルできています。 f:id:tsalvia:20190313021146p:plain

Ghidraデバッグモードにおける注意点

※ こちらの内容は、Ghidra v9.0.1で修正されました。
Ghidra: Release Notes より

Basic Infrastructure. Running Ghidra in debug mode no longer opens remotely accessible ports by default. (Issue #6)


Ghidraをデバッグモードで起動すると、JDWP用のデバッグポート(18001番)が開かれます。 ただし、デフォルトでローカルだけでなく、インターネットにも公開状態となってしまいます。 通常、インターネットに公開する必要はないので、閉じておきましょう。 既にJDWPのデバッグポートを利用したPoCも公開されています。

修正方法

ghidra_9.0\support\launch.bat 140行目

set VMARG_LIST=!VMARG_LIST! -Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=*:!DEBUG_PORT!

↓ 下記のように書き換える

set VMARG_LIST=!VMARG_LIST! -Xrunjdwp:transport=dt_socket,server=y,suspend=!SUSPEND!,address=127.0.0.1:!DEBUG_PORT!

ghidra_9.0\support\launch.sh 150行目

VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=*:${DEBUG_PORT}"

↓ 下記のように書き換える

VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=127.0.0.1:${DEBUG_PORT}"

参考になるサイト

NTFSFileExtractor - NTFSボリュームから特定のファイルを抽出する

NTFSFileExtractor について

github.com

このツールを使用すると、NTFSボリュームを解析してファイルを抽出することができます。 例えば、下記のようなファイルを抽出することができます。

  • 削除されたファイル
  • 今使用されているファイル
  • 指定したMFT IDのファイル

今回は、特定のファイルを抽出する方法について紹介します。

MFT IDを指定してファイルを抽出する

今回は、通常の操作で抽出することができない$UsnJrnlファイルの抽出を行ってみます。 ちなみに、このファイルをNTFS Log Trackerに解析させると、ファイルの操作履歴が確認できます。

事前準備(MFT IDを特定する)

NTFSFileExtractorは、特定のファイルを抽出したい場合、MFT IDを指定する必要があります。 fteで$MFTを解析することで、MFT IDを特定できます。

www.kazamiya.net

  1. 「Run」ボタンを押すと、解析が始まります。
  2. 「File」→「Export」で解析結果をテキスト形式で出力することができます。

ファイル名が分かっている場合は、PowerShellなどで検索すると便利です。 今回の場合、3つ目のエントリ(78509)が$UsnJrnlのMFT IDになります。

> type .\fte_result.txt | Select-String "UsnJrnl"
$UsnJrnl|2137|78509|11|Unknown|POSIX|1|FILETIME|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.9138068|2019/01/10 21:54:07.913806
8| cr  =  m  =  c  =  a  =  fcr  =  fm  =  fc  =  fa

特定のファイルを抽出する

  1. 「User Selec」を選択して、「Start Extraction」を実行する。
    f:id:tsalvia:20190303130728p:plain
  2. 「User Selected File Set」のウインドウが表示されたら、78509($UsnJrnlのMFT ID)を指定して「OK」を押す。
    f:id:tsalvia:20190303134743p:plain
  3. NTFSFileExtractorを実行した場所に「C」というディレクトリが作成されています。余計なファイルも出力されていますが、「$Extend」以下に目的のファイルが抽出されています。
    f:id:tsalvia:20190303135552p:plain

参考情報

PECmd - Windows Prefetchの解析

Windows Prefetch について

Windows Prefetchは、アプリケーションの起動の高速化のために導入された機能です。 Prefetchファイルには、下記のような情報が含まれています。

  • 実行ファイル名(最大29文字)
  • アプリケーションの実行回数
  • ボリュームパスやボリュームシリアル番号などのボリューム関連情報
  • アプリケーションの起動に使用されたファイルとディレクト
  • アプリケーションが最後に実行された時刻

Prefetchファイルには、上記の情報が含まれているので、 解析することでプログラムの実行痕跡などが得られる可能性があります。

なお、Prefetchファイルは、下記のディレクトリに「~.pf」という拡張子で格納されています。

C:\Windows\Prefetch

PECmd(Prefetchファイルの解析ツール)

Prefetchファイルの解析ツールは、色々とありますが、今回はPECmdというコマンドラインのツールを紹介します。 PECmdは、Prefetchファイルをパースすることで、下記の項目を抽出することができます。

PECmdは、こちら(Eric Zimmerman's tools)のページでダウンロードできます。

※ ただし、Windows 8以下のバージョンでは、Windows 10のPrefetchファイルを解析できないので、注意してください。

使い方

基本

  • Prefetchファイルを直接指定する(-f オプション)
PECmd.exe -f "NOTEPAD.EXE-B28CC291.pf"
  • Prefetchファイルが格納されているディレクトリを指定する(-d オプション)
    指定したディレクトリ内に存在するPrefetchファイルを再帰的に読み込みます。
PECmd.exe -d "C:\Windows\Prefetch"

実行例(Prefetchファイルを直接指定する)

今回は、例として C:\Users\TEST\Desktop\test.txtnotepad.exe で開いたときに生成されたPrefetchファイルを解析してみます。下記が解析結果より、実行時間や参照したファイルなどが確認できます。

C:\Windows\Prefetch>PECmd.exe -f NOTEPAD.EXE-B28CC291.pf
PECmd version 1.3.0.0

Author: Eric Zimmerman (saericzimmerman@gmail.com)
https://github.com/EricZimmerman/PECmd

Command line: -f NOTEPAD.EXE-B28CC291.pf

Keywords: temp, tmp

Processing 'NOTEPAD.EXE-B28CC291.pf'

Created on: 2019-02-24 04:55:17
Modified on: 2019-02-24 04:54:06
Last accessed on: 2019-02-24 05:02:51

Executable name: NOTEPAD.EXE
Hash: B28CC291
File size (bytes): 50,472
Version: Windows 10

Run count: 2
Last run: 2019-02-24 04:54:03
Other run times: 2019-02-24 04:11:39

Volume information:

#0: Name: \VOLUME{01d4cbf353a8246d-f25451a4} Serial: F25451A4 Created: 2019-02-24 03:45:04 Directories: 17 File references: 103

Directories referenced: 17

00: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA
01: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT
02: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS
03: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES
04: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS
05: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST
06: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST\DESKTOP
07: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS
08: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\FONTS
09: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION
10: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION\SORTING
11: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32
12: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME
13: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP
14: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED
15: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP
16: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINSXS\AMD64_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.17763.107_NONE_05B63884071E656E

Files referenced: 81

00: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NTDLL.DLL
01: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NOTEPAD.EXE
02: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNEL32.DLL
03: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNELBASE.DLL
04: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\LOCALE.NLS
05: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\ADVAPI32.DLL
06: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCRT.DLL
07: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SECHOST.DLL
08: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RPCRT4.DLL
09: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\GDI32.DLL
10: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\GDI32FULL.DLL
11: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCP_WIN.DLL
12: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\UCRTBASE.DLL
13: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\USER32.DLL
14: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WIN32U.DLL
15: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COMBASE.DLL
16: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\BCRYPTPRIMITIVES.DLL
17: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COMDLG32.DLL
18: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHCORE.DLL
19: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHLWAPI.DLL
20: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\SHELL32.DLL
21: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CFGMGR32.DLL
22: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINDOWS.STORAGE.DLL
23: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\PROFAPI.DLL
24: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\POWRPROF.DLL
25: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\KERNEL.APPCORE.DLL
26: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPTSP.DLL
27: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINSXS\AMD64_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.17763.107_NONE_05B63884071E656E\COMCTL32.DLL
28: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\PROPSYS.DLL
29: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEAUT32.DLL
30: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINSPOOL.DRV
31: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\BCRYPT.DLL
32: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\URLMON.DLL
33: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IPHLPAPI.DLL
34: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IERTUTIL.DLL
35: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPTBASE.DLL
36: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IMM32.DLL
37: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\NOTEPAD.EXE.MUI
38: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\WINDOWSSHELL.MANIFEST
39: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLE32.DLL
40: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RPCSS.DLL
41: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\UXTHEME.DLL
42: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CLBCATQ.DLL
43: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MRMCORER.DLL
44: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSCTF.DLL
45: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\DWMAPI.DLL
46: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\CRYPT32.DLL
47: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSASN1.DLL
48: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\FONTS\STATICCACHE.DAT
49: \VOLUME{01d4cbf353a8246d-f25451a4}\$MFT
50: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\EFSWRT.DLL
51: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MPR.DLL
52: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WINTYPES.DLL
53: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\TWINAPI.APPCORE.DLL
54: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\RMCLIENT.DLL
55: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\GLOBALIZATION\SORTING\SORTDEFAULT.NLS
56: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEACC.DLL
57: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\OLEACCRC.DLL
58: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\C_1252.NLS
59: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\TEXTINPUTFRAMEWORK.DLL
60: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COREUICOMPONENTS.DLL
61: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\COREMESSAGING.DLL
62: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\NTMARTA.DLL
63: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPTIP.DLL
64: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\VERSION.DLL
65: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPAPI.DLL
66: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMJKAPI.DLL
67: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\POLICYMANAGER.DLL
68: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\MSVCP110_WIN.DLL
69: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\IMEJP\IMJPPRED.DLL
70: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMETIP.DLL
71: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\DUI70.DLL
72: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMECFM.DLL
73: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\WER.DLL
74: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\MSCTF.DLL.MUI
75: \VOLUME{01d4cbf353a8246d-f25451a4}\USERS\TEST\DESKTOP\TEST.TXT
76: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\CVERSIONS.2.DB
77: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\{6AF0698E-D558-4F6E-9B3C-3716689AF493}.2.VER0X0000000000000001.DB
78: \VOLUME{01d4cbf353a8246d-f25451a4}\PROGRAMDATA\MICROSOFT\WINDOWS\CACHES\{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.VER0X0000000000000001.DB
79: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\JA-JP\PROPSYS.DLL.MUI
80: \VOLUME{01d4cbf353a8246d-f25451a4}\WINDOWS\SYSTEM32\IME\SHARED\IMESEARCHDLL.DLL

---------- Processed 'NOTEPAD.EXE-B28CC291.pf' in 0.02787400 seconds ----------

追加オプション

出力先指定

  • json形式で出力する(--json オプション)
    • --json オプションには、出力先のディレクトリ名を指定します。
    • --pretty オプションを付けると、Human Readableな形式で出力されます。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput"
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput" --pretty
  • csv形式で出力する(--csv オプション)
    • --csv オプションには、出力先のディレクトリ名を指定します。
    • 出力先のディレクトリに下記の2つのファイルが生成されます。
      • Prefetchファイルのパース結果
      • 実行ファイルのタイムライン
PECmd.exe -d "C:\Windows\Prefetch" --csv "csvOutput"
PECmd.exe -d "C:\Windows\Prefetch" --html "C:\Users\TEST\Desktop\htmlOutput"

日時表示形式の指定

  • 時刻表示を現地時刻にする(--local オプション)
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --local
  • 日時表示形式を変更する(--dt オプション)
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --dt "yyyy/MM/dd HH:mm:ss"
  • 時刻表示の精度を上げる(--mp オプション)
    • 0.1マイクロ秒まで表示する。
      (例:2019-02-24 04:54:03 → 2019-02-24 04:54:03.3462456)
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --mp

その他

  • 特定のキーワードをハイライトする(-k オプション)
    • 指定したキーワードに該当する行が赤字でハイライトされます。
    • デフォルトのキーワードとして、tempとtmpが設定されています。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf -k "USERS"
  • 出力を抑制モードにする(-q オプション)
    • jsoncsvなどの形式で出力する場合に使用する。
    • ディスプレイ表示を抑制して、処理を高速化させる。
PECmd.exe -f NOTEPAD.EXE-B28CC291.pf --json "jsonOutput" -q

参考情報

Windows Prefetchについて

PECmd関連

CyberChefの使い方

CyberChefとは

Base64、URLエンコード、AES復号など200以上の変換が行える万能ツールです。
また、変換処理はすべてクライアントサイドで行われるので、入力したデータがどこかに送信される心配もありません。
※ ダウンロード版もあるので、心配な人はオフラインで実行してみてください。

CTFとかにも使えるので、かなり重宝してます。
ただ、ドメインgchqと書かれているのが少し気になりますね

gchq.github.io

使い方

基本操作

  1. 「Input」に変換したいものを入力する。
  2. 「Operations」から操作方法を選択し、「Recipe」にドラッグアンドドロップする。

Base64デコード例

  1. 「Input」に変換したいBase64文字列を入力する。
  2. 「Operations」から「From Base64」を選択し、「Recipe」にドラッグアンドドロップする。

20190221235006

応用 - 多重変換

AESで復号→Base64デコード→画像変換

  1. 「Open file as input」で変換したいファイルを選択する。
  2. 「Operations」から「AES Decrypt」を「Recipe」にドラッグアンドドロップする。
    • 「Key」にAES Keyを指定する。今回は、UTF-8で「aaaaaaaaaaaaaaaa」にしています。
    • 「IV」に IVを指定する。今回は、UTF-8で「bbbbbbbbbbbbbbbb」にしています。
    • 「Mode」にAESアルゴリズムを指定する。今回は、「CBCモード」にしています。
  3. 「Operations」から「From Base64」を「Recipe」にドラッグアンドドロップする。
  4. 「Output」の「Render Image ~」アイコンをクリックする。

20190222011657