第53話

 二海はしばらく考えた。とにかく、少なくとも『はずれ』と表示するようになっている。じゃあ、どこかにその動きをさせるためのものがあるはずだ。


 二海は一行ずつHTMLソースを追っていった。そうしていくと、ある一行に目が留まった。


 そこは、画像ロゴに対応しているタグの行だった。二海がとくにそこに注目したのは、それがふつう画像を表示するときに使うタグとは違っていたからだ。画像を表示するときは、たいてい<img>タグを使う。二海も自分のページを作ったときにはそれを使った。しかし、このページで使っているのは<canvas>タグだった。<canvas>タグは、ページ上で画像を描く時に使うものだと読んだことがあった。なぜ、それをわざわざここで使っているのだろう。見たところ、表示されているのはふつうの画像ロゴだ。


 二海はJavaScriptのコードに戻った。canvas、という文字列を探す。コードの中で、それを使っている箇所はすぐ見つかった。そして、次に『送信』ボタンにつけられているidを使ったコードも探した。


(eval……)


 evalは、渡された文字列をJavaScriptとして実行する関数だ。eval('2 + 2')というコードがあったら、evalが『2 + 2』を実行し、4をいう値を返す。しかし、渡された文字列をそのまま実行するというのは、脆弱性が入り込む危険が大きい。CTFの本だけでなく、通常のWebアプリケーションを扱った本にもその危険性は書いてあった。


 今回、evalに渡されているのは、canvasの中のデータを何かしら加工したものだった。その『何かしら』はJavaScriptコードの中に書いてあるのだが、Int16Arrayだのといった見慣れないコードが書いてあり、何をしているのかがうまく読み取れない。


 しかし、evalに渡されているからには、JavaScriptのコードであることは間違いない。canvasの中のデータは、画像だ。画像を加工すると、JavaScriptのコードになる?


「そんなことあるのかなあ……」


 二海は一旦問題のページを離れ、『画像 JavaScript』で検索してみた。『JavaScriptで画像を表示する方法』というようなものばかりでてくるので、『変換』だの『埋め込み』だのキーワードを追加して試す。


 しばらく検索結果を調べていると、あるページが見つかった。『画像にJavaScriptを埋め込む方法』というものだ。


「これ?」


 読むと、そのページにはまさしく二海が調べていたことそのものが書いてあった。JavaScriptのコードの一文字一文字を、画像の情報を埋め込む。理屈としてはそういうものらしい。しかし、その下のほうの詳細な解説を見て、「はあー」と二海は声を上げてしまった。数学だった。それも難しいやつ。『離散』だの『フーリエ変換』だのという文字が目につく。


「すいません、里々さん」


 二海は里々のそばにより、声をかけた。


「ん、なあに」

「ここのページのやつ、わかりますか?」


 里々にノートパソコンの画面を見せる。里々はそれにじっと見入った。


「離散ウェーブレット変換」


 里々はざっと全体を見ると、荷物置き場の方へ行ってルーズリーフを取り出し、本棚から『もう一度やるデジタル信号処理』という本を持ってきた。


「たしかあったような……」


 本とノートパソコンを見比べながら、里々はルーズリーフに数式を並べだした。xでもyでもない、見慣れない文字が記号として出てきている。その時点で二海にとっては数式が恐ろしいものにしか思えなかった。


 しかし、里々にとってはちがうようだった。本を見ながら、数式を何度も書き直したり、図やグラフを書きなぐってみる。そしてルーズリーフを二枚つかったところで、


「なんとなくわかったかも」と里々は二海のほうを向いた。


「えっ、すごい」

「ほんとなんとなくだからね。えっとね、まず、こういう画像データっていうのが、点のあつまりで表されてるんだよね」

「えっと、はい」

「ひとつの点にしぼって言えば、その点がどんな色で、どの位置にあるか、っていう情報を持っているわけでしょう」

「あの、ここの点は白色で、左上の一番隅にあります、みたいなことですか?」

「そー。で、その点のあつまりが画像になると。そうしたら、その画像には、点が持ってる『どの色で、どの位置にあるか』っていう情報をぜんぶ持ってるわけね」

「はい……はい。そこまではなんとなくわかります」

「じゃ、それをこの画像って形じゃなくて、数をつかって表そうとしたときに、例えばこういう表し方ができるでしょう」


 里々はそう言いながら、新しいルーズリーフに二本直交する線を引いた。x軸とy軸というやつだ。


「この横軸を点の位置。縦軸を色として表す。そうすると、たとえばこういうふうに」と、里々はうねうねとグラフを引いた。「こういうグラフで画像が表せるということになるのね」

「えっと、ちょっと待ってください。横が位置、で、縦が色……」

「そう」


 里々と二海がそうやってしばらく話していると、後ろから桃が覗き込んだ。


「何してるの?」

「あ、今、この問題でこういうのが出てきて……」


 二海は自分のノートパソコンの画面を見せ、画像にJavaScriptが埋め込まれているということを説明した。桃はしばらくそれを見た上で、


「これ……このJavaScriptで処理してるんだよね?」

「うん」

「じゃあさ、ここの関数の理屈は今の所わからなくても、手元にダウンロードして書き換えて動かせば画像から取れるコードも取得できるんじゃない?」


 二海と里々はは少しの間動きを止めた。そして、「たしかに」と同時につぶやいた。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る