@port139 Blog

基本的にはデジタル・フォレンジックの技術について取り扱っていますが、記載内容には高確率で誤りが含まれる可能性があります。

バイナリから文字列を抽出する

バイナリから指定した文字列を取り出す方法としては、古典的な手法として strings コマンドがあります。主に ASCII で利用されますが、The Sleuth Kit などでは英数字の UNICODE について取り出すことも出来るはずです。他にも Unicode に対応した Strings コマンドは幾つかあると思いますが、日本語を取り出すというのはなかなか厄介です。The Sleuth Kit は strings で取りだした文字列に grep かける検索方法なので、日本語などは思いっきり落ちてしまうはずですが、実は最近になって良くなったりしているんでしょうかね?
バイナリファイルから日本語文字列を取り出すという用途では、やはり istrings などの日本語に対応しているツールを利用する必要があります。日本語に対応した strings コマンドとしては、私の知る範囲では、はせがわさん作の istrings と、もとのぶ先生作の jstrings の二つがあります。

istrings 0.2
http://openmya.hacker.jp/hasegawa/
http://www.st.ryukoku.ac.jp/~kjm/security/ml-archive/port139/2003.05/msg00175.html
http://d.hatena.ne.jp/hasegawayosuke/20050715/1121408744

jstrings (Japanese 'strings' command)
http://www.monyo.com/technical/products/jstrings/

FNG15 には開催を招集した、はせがわさんも参加されていたので懐かしいという話題になりましたが、kjm先生のところにある port139ml のログによると 7年度ほど前、2003年頃の話題みたいですね。まぁ作者もすっかり動かし方を忘れていたくらいですし(笑)
昔からあるフォレンジック調査における課題といえば課題ですね。そしていまだ完全には解決していない(笑)
7年経過して新たに登場したツールが、KaniGrep ということになるんですが、これは istrings と違い単体で動作するコマンドではなく EnCase のスクリプトとして実装されています。
※近いうちに更新されると思いますが、現時点では v0.9 が公開されています。

http://www.ji2.co.jp/forensics/tools/index.html

KaniGrep は正規表現パターンを使い、平仮名3文字、片仮名3文字などの日本語文字列パターンを探し出すというもので、文字コードも複数を同時に検索してきます。ただし、日本語文字列を包括的に探すというものではありません。機能としては漢字を含むものを探すこともできますので、istrings と同様に広い範囲の日本語文字列を探させることも可能なはずです。しかし、範囲を広げるとノイズとなるヒットが増えるので、個人的には漢字を含む範囲を検索させるのはあまりお奨めできない気がしていますが。なお、istrings でもマップファイルを編集すれば範囲を絞ることが可能です。

メモリダンプからtessyを探せ!!

今回の FNG15 では題材ファイルとして以下のメモリダンプファイルを用意してみました。

・Web サイト(twitter.com)で @tessy_jp のつぶやきを閲覧
Gmail でメールを閲覧
Windows Live Mailで POP で Gmail から取得したメールを閲覧

いやぁ並べて書いてみると、UTF-8 ばっかりで全然面白くないんぢゃね?という気がしますね、もう少し考えてネタを用意しておけばよかったですね。
まずは Twitter における @tessy_jp さんのつぶやきを探してみましょうということになったのですが、Twitter の場合は HTML 構文に特徴があるので、結論としては「パターンがあるデータはパターンを検索したほうが早い」ということですね。ただし、Gmail のデータなどについては、前後に特徴のあるパターンがない状態でメールデータが存在しているケースもありえる為、その様なケースでは KaniGrep のようなアプローチが必要になると思われます。

バイナリエディタは何がお奨めか?!

手元では Stirling を使っていることが多かったのですが、今回 @murachueさんに Binary Editor BZ が良い!と教えていただいたので、BZエディタを使ってみました。

Binary Editor BZ
http://www.forest.impress.co.jp/lib/stdy/program/progeditor/binaryeditbz.html

UTF-8エンコードにも対応しており、速度的にも早かったです。今回は 512メガのファイルでしたが、特に違和感なく使えていたので、しばらく BZ を使って見る予定です。
ただ、フォレンジック調査とかの面では文字コードの切り替えが頻繁に発生したりするので、ここはやはり KaniEditor が将来的には必要なのではないかとちょっと感じたところです。
バイナリエディタUTF-8 な文字列を探す場合に、興味深かったアプローチとしては、@murachueさんが意図的に文字コードShift_JIS に切り替えて UTF-8 部分を化けさせるという方法ですね。バイナリをざっと眺めていく時に、UTF-8 の日本語文字列部分が化けて固まっているので、見つけやすいというメリットがあるようです。

wiconvにバイナリを喰わせる

かなりメモリを消費したりするようですが、wiconv にバイナリファイルを喰わせ、文字コードを変換することでゴミを削るアプローチを @hasegawayosuke さんが挑戦されていました。

wiconv - 文字列のコードページの変換
http://openmya.hacker.jp/hasegawa/wiconv/

wiconv により、UTF-8 から Shift_JIS文字コードを変換することで、壊れた UTF-8 な文字列などは ? などに置換されるので、「?」文字などを後から除去すれば有意な文字だけ残るのではないか?というアプローチだったと思いますが、結局うまくいかなかったんでしたっけ!?

ノイズを除去するというアプローチは、Unallocated Clusters などを調査する上では有効な手法かもしれません。0x00 のような文字では使われないバイトを除去することで、調べる必要があるデータ量が減るので、検索や変換なども早くなる可能性があります。問題としては、オフセット位置などをどう維持するのか?という辺りがありますが、これは今後の検討課題ですかね。

istringsで UTF-8 を抽出する

istrings の標準では UTF-8 に対応していないということで、@hasegawayosuke さんが(範囲を絞った)マップを追加してバイナリファイルからの文字列抽出を実験されてました。結果を拝見したところ、なかなか結果は人間が見やすい状態になっており調べやすい雰囲気でした。ただ、半角英数時でゴミというかノイズになる文字列のが多かったので、istrings で UTF-8 を抽出後、さらに半角英数のノイズパターンを取り除くか何らかの処理を行なうことで、日本語文字列だけをうまく残し目視しやすくなるかもしれません。

istringsをFreeBSDで使いたい人向け

@nmantaniさんが5年ぶりに修正されたそうです(笑)

http://twitter.com/nmantani/status/19416056679

FreeBSD を日頃使ってないので port にあったことを知らなかったのですが、FNG15 の会場で「確かFreeBSD のリクエストで istrings の port な話題が出ていたような」「あーそれ port したの自分」みたいな会話が出てました。世間は狭いというか...
あと、フォレンジック方面のツールで幾つか port が更新されているようです。

http://twitter.com/nmantani/status/19417261624
http://twitter.com/nmantani/status/19429520924