From a19a07d381c8a7fde1812693e36f843a00ea457b Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 11 Jan 2025 00:02:06 +0900 Subject: feat(blog/content): update post /posts/2025-01-08/phperkaigi-2023-tokens-q1/ --- .../2025-01-08/phperkaigi-2023-tokens-q1.ndoc | 53 ++++++++++++++-------- 1 file changed, 34 insertions(+), 19 deletions(-) (limited to 'vhosts/blog/content/posts') diff --git a/vhosts/blog/content/posts/2025-01-08/phperkaigi-2023-tokens-q1.ndoc b/vhosts/blog/content/posts/2025-01-08/phperkaigi-2023-tokens-q1.ndoc index 82747627..37345849 100644 --- a/vhosts/blog/content/posts/2025-01-08/phperkaigi-2023-tokens-q1.ndoc +++ b/vhosts/blog/content/posts/2025-01-08/phperkaigi-2023-tokens-q1.ndoc @@ -13,6 +13,10 @@ tags = [ [[article.revisions]] date = "2025-01-08" remark = "公開" + +[[article.revisions]] +date = "2025-01-11" +remark = "読みやすさのため一部の文言を調整" ---
@@ -21,14 +25,16 @@ remark = "公開" これは PHPerKaigi 2023 の記事です。今は 2025 年ですが、PHPerKaigi 2023 の記事です。

- 2023-03-23 から 2023-03-25 にかけて開催された PHPerKaigi 2023 では、弊社デジタルサーカス株式会社からトークン問題を出題した。 - 「トークン問題」とは、PHPerKaigi 2023 でおこなわれた PHPer チャレンジと呼ばれる企画で使われたもので、この記事で説明するような問題を解くと、「PHPer トークン」と呼ばれる「#」から始まる文字列を得ることができる。参加者がこのトークンを集めると、景品などが得られるという仕組みである。 + 2023-03-23 から 2023-03-25 にかけて開催された PHPerKaigi 2023 では、PHPer チャレンジという企画がおこなわれた。 + PHPer チャレンジとは、スポンサーのパンフレットやカンファレンス会場などから「#」記号で始まる文字列を集め、景品などを得るという企画である。 + この文字列は「PHPer トークン」と呼ばれている。弊社デジタルサーカス株式会社からは、トークン問題という形で、PHP に関する問題を解くと PHPer トークンが得られるようになっている問題を出題した。

- PHPerKaigi 2023 の参加レポ でも書いたとおり、この年のトークン問題は「昨年の PHPerKaigi 2022 が終わった段階から作り始め、約半年かけて制作」された。PHPerKaigi 当日も PHPer チャレンジ解説セッション という形で解説の機会を頂いたのだが、せっかくなので記事の形でも残しておこうと思う。 + PHPerKaigi 2023 の参加レポ でも書いたとおり、この年のトークン問題は「昨年の PHPerKaigi 2022 が終わった段階から作り始め、約半年かけて制作」された。 + PHPerKaigi 当日も PHPer チャレンジ解説セッション という形で解説の機会を頂いたのだが、せっかく時間をかけて作題したので記事の形でも残しておこうと思う。

- この記事は、全5問ある中の第1問について解説する。他の問題については以下のリンクを参照のこと。 + この記事では、全5問ある中の第1問について解説する。他の問題については以下のリンクを参照のこと。

  1. 第1問 (この記事)
  2. @@ -37,6 +43,9 @@ remark = "公開"
  3. 第4問 (TODO: 執筆中)
  4. 第5問 (TODO: 執筆中)
+

+ それぞれの問題はこちらの GitHub リポジトリ (nsfisis/PHPerKaigi2023-tokens) からも閲覧できる。 +

Q1: An Art of Computer Programming @@ -48,7 +57,7 @@ remark = "公開"
解き方

- まずはトークンを得る方法を解説なしに説明する。次のように実行する。 + まずはトークンを得る方法を解説抜きで説明する。次のように実行する。

解説
- 画像として読む + 画像として解釈する

まずは素直に画像として見てみよう。 全体は QR コードになっている。適当な QR コードリーダで読み込むと、次のようなテキストが表示されるはずだ。 @@ -92,7 +101,7 @@ remark = "公開" ]]>

- すでに「解き方」の節で示したように、パスワードである PHPer トークンは「#iwillblog」で、これを与えると正解のトークンが得られる。 + すでに「解き方」の節で示したように、パスワードである PHPer トークンは「#iwillblog」である。これを与えて実行すると正解のトークンが得られる。

このパスワードの選択にはとある事情がある。 @@ -128,7 +137,7 @@ remark = "公開" CLI で実行する場合、PHP タグよりも前にあるデータは標準出力へそのまま出力される。

- この2つの事実を使って、この画像ファイルは次のような構造になっていた。 + この画像ファイルは次のような構造になっていた。

  1. マジックナンバーなど
  2. @@ -139,7 +148,10 @@ remark = "公開"
  3. 通常の PHP ソースコード

- strings コマンドを使うと、隠されたデータを浮き彫りにできる。 + PNG ファイルとして読むときは PNG フッタ以降は無視され、PHP スクリプトとして読むときは PHP タグ以前が無視されるという仕掛けである。 +

+

+ strings コマンドを使うと、隠されたデータを簡単に閲覧できる。

- IHDRIEND は PNG 画像の一部である。<?php からが実際のプログラムになっている。 + IHDRIEND が PNG 画像の一部で、<?php からが実際のプログラムになっている。 もちろんこれを PHP プログラムとして動かすと、PHP タグより前にある PNG 画像としてのデータはそのまま標準出力へと出力されてしまう。 - それを防ぐため、QR コードを読み込んだときの実行方法には + それを防ぐため、QR コードを読み込んだときの実行方法

- 標準出力を捨てるよう >/dev/null と指定されている。 + には標準出力を捨てるよう >/dev/null と指定されている。

なお、このように PNG 画像などに本来のデータとは異なる別のデータを隠すことを「ステガノグラフィ」(Wikipedia「ステガノグラフィー」) と呼ぶ。 @@ -176,8 +188,9 @@ remark = "公開"

実行される PHP プログラム

- 画像の正体がわかったところで、画像に隠されていた PHP プログラムについて見ていこう。先ほどは一部しか記載しなかったので、全体を載せる。 - なお、雑にゴルフしながら書いたので、空白こそ残しているものの可読性は非常に低いことと思う。 + 画像の正体がわかったところで、画像に隠されていた PHP プログラムについて見ていこう。 + 先ほどは一部しか記載しなかったので、全体を載せる。 + なお、ある程度ゴルフしながら書いたので、空白こそ残しているものの可読性は非常に低いことと思う。

- これは一体なんなのか。ずばり、難解プログラミング言語の一つ Piet のインタプリタになっている。 + これは一体なんなのか。ずばり、難解プログラミング言語の一つ Piet のインタプリタである。 Piet はピエト・モンドリアン (『赤・青・黄のコンポジション』などで知られる抽象画家) の作品にインスピレーションを受けて作られた、画像をソースコードとするプログラミング言語である。 インタプリタは画像の各ピクセルの上を進みながら、色等に応じて特定の処理をおこなっていく。 - ここでは詳しい言語仕様については解説しないので、Wikipedia の記事「Piet」 などを参照してほしい。 + ここでは詳しい言語仕様については解説しないので、気になる方は Wikipedia の記事「Piet」 などを参照してほしい。

プログラムの冒頭にあるこの箇所 @@ -381,11 +394,13 @@ remark = "公開" おわりに

この問題の自己評価はこちら。 + 問題の出題順はおおよそ作成した順になっているのだが、そのせいで難易度高めの問題が1問目に配置されてしまった。 + これは反省点の一つである。

    -
  • 難しさ: 2位 / 全5問
  • -
  • お気に入り度: 4位 / 全5問
  • -
  • 鮮やかさ: 1位 / 全5問
  • +
  • 難しさ: ★★★★
  • +
  • お気に入り度: ★★
  • +
  • 鮮やかさ: ★★★★★★★
-- cgit v1.2.3-70-g09d2