今回の問題
picoCTFより"Bookmarklet"を解いていきます。
実際に解いていく
1. 問題文にあるWebサイトに移動する
うん。ヒントというか答えが書いてますね。
プログラム部分をクリックしてコピーします。
2. [Console]タブでプログラムを実行する
Webインスペクタを開きます。
[Elements]タブから、[Console]タブに移動します。
コピーしたプログラムを貼り付けて、Enterキーで実行!
3. FLAG獲得!
もう少し考えてみる
すでにFLAGは獲得しましたが、どのような暗号を使っていたかが気になるのでJavaScriptの中身を見ていきます。
1. JavaScriptを見る
javascript:(function() {
var encryptedFlag = "àÒÆÞ¦È¬ëÙ£ÖÓÚåÛÑ¢ÕÓ¡ÒŤí";
var key = "picoctf";
var decryptedFlag = "";
for (var i = 0; i < encryptedFlag.length; i++) {
decryptedFlag += String.fromCharCode((encryptedFlag.charCodeAt(i) - key.charCodeAt(i % key.length) + 256) % 256);
}
alert(decryptedFlag);
})();
なるほど。すごくシンプルな暗号です。
2. 暗号の解読
暗号を解読していきます。暗号の流れはこんな感じです。
- encryptedFlagに"àÒÆÞ¦È¬ëÙ£ÖÓÚåÛÑ¢ÕÓ¡ÒŤí"という暗号化された文字列があります
- keyに"picoctf"という鍵があります
- forループで
・暗号化された一文字ごとに
・(暗号化された文字コード - 鍵の文字コード)/ 256 をして
・decryptedFlagに入れる
以上です。上の式では省略していますが、鍵の文字コードに+256されています。おそらく、最後に256で割った時に、負の値になってしまうのを防ぐためです。
まとめ
今回の問題は簡単でした。
暗号に関しても、鍵を使用して各文字の文字コードを変換する簡易的な暗号でした。古典的な暗号化手法(シーザー暗号など)に似ているように思えます。
補足
・今回はBookmarkletを使わずに、コンソールに直接JavaScriptを貼り付けて実行しました。
・Bookmarletとは、ざっくりいうと「ブラウザのブックマークから、JavaScriptを実行する」仕組みです。拡張機能とは異なるので注意してください。