概要
- コードの難読化解除(デオブファスケーション)は、コード解析やリバースエンジニアリングにおいて非常に重要なスキル
- レッドチーム/ブルーチーム演習では、しばしば機能を隠すために難読化されたコードに遭遇する
- マルウェアが難読化されたJavaScriptを使って本体のペイロードをダウンロードするようなケース
サイトのコードを見ると、このように難読化されていることがある
- これが難読化
- パッと見て、どんな処理をしているのかわからない
eval(function (p, a, c, k, e, d) { e = function (c) { '...SNIP... |true|function'.split('|'), 0, {}))
難読化とは、人間がコードを読みにくくするための技術
- コードとしての機能や処理結果は変わらない
- 難読化ツールによって自動的に実行される
- 多くの難読化ツールは、コード内のすべての単語や記号を辞書化し、それらをもとに実行時に元のコードを再構築するような手法を用いる
- JSはユーザーから参照できるので、コードを難読化して保護するという手法がよく使われる
- 実際のところ、難読化は攻撃目的で使われることが最も多い
- 侵入検知システム(IDS)や防御システム(IPS)を回避するために難読化される
主要な難読化手法
圧縮
- ミニファイとは?
- 改行や空白を除き、コードを1行に圧縮したもの
- コードの機能はそのままだが、読みづらくなる
- ミニファイされたJavaScriptファイルは .min.js 拡張子が使われることが多い
パッキング
- BeautifyTools の JavaScript Obfuscator を使う
実際にパッキングすると、このように難読化される
- 特徴
- function(p,a,c,k,e,d) という6つの引数が使われるのが一般的
- コード中の単語や記号をリストや辞書形式に変換し、実行時に再構築
- p,a,c,k,e,d はそれぞれの文字列や記号の位置関係を指定するために使われる
- 注意点
- 文字列が平文のまま残っていることが多く、そこから機能がバレる可能性がある
そのほかの難読化手法
- 多重暗号化
- Base64
- 変数名置換
高度な難読化手法
- 完全に難読化し、オリジナルの痕跡を一切残さないようなツールを使ってみる
- Obfuscator.ioの使用する
- 設定からString Array Encoding を Base64 に変更する
オリジナルのJSコードをペーストして、「Obfuscate」をクリック
難読化済みの出力
- Evaluateを押すと、正常に実行できていることがわかる
全く、オリジナルのJSコードがわからない状態になる
- 設定で、もっと難読化することもできる
- だけど、やりすぎるとコード実行時の処理が重くなるため、パフォーマンスに悪影響を与える可能性がある
- 特に JJ Encode や AA Encode のような特殊なオブファスケーターは、実行速度が著しく低下する
- 通常はここまでやらない
難読化解除
整形
- 圧縮されて、一行になっているものを読みやすい形式に戻すこと
- Firefox なら以下の手順で可能
- [Ctrl + Shift + Z] を押して「デバッガー」を開く
- スクリプト secret.js を選択
- 画面下部の { }(Pretty Print)ボタン をクリック
確かに見やすくなった
以下のオンライン整形ツールを使っても綺麗に整形できる
しかし、まだコードの意味はわかりづらいまま
→ 難読化もされてるため
パッキングの解除
- 難読化解除ツールを使ってコードをわかりやすい状態に戻す
- UnPackerというツールがある
確かに難読かが解除されて普通に読める形になっている
- ただし、難読化がさらに高度になると、ツールだけでは解析不可能な場合がある
- 特にカスタム難読化ツールが使われている場合には、
- 手動でコードを解析
- 元のロジックを推測
- ステップごとに出力を確認することが必要になる
- 特にカスタム難読化ツールが使われている場合には、
何でエンコードされているのかがわかるツール
参考
https://academy.hackthebox.com/course/preview/javascript-deobfuscation