SECCON Beginners CTF 2019 Writeup - Sliding puzzle

2019/05/27 |

01

今年も SECCON Beginners CTF に問題作成で参加しました。作問者視点の Writeup を簡単に書こうと思います。

[misc] Sliding puzzle (106 solves / 206 pts)

02

今回は misc の Sliding puzzle という問題を作成しました。106のチームに解いていただき、最終的なポイントは206になりました。この問題の原題は誰もが見たことがあるかと思います。知らない方は 8 puzzle とかで Google 画像検索をすると良いと思います。

問題概要

この問題では以下のような形でパズルの初期状態が与えられました。

----------------
|  0 |  2 |  3 |
|  6 |  7 |  1 |
|  8 |  4 |  5 |
----------------

問題文に 0はブランクで動かすことが可能 とあるのは、原題でいうところの数字のブロックが何も入っていない箇所を示していました。このブランクを以下の操作方法で操作して、最終的な形を作れれば正解となりました。

0 : 上 (0と上の数字を入れ替える)
1 : 右 (0と右の数字を入れ替える)
2 : 下 (0と下の数字を入れ替える)
3 : 左 (0と左の数字を入れ替える)

問題文では言及していませんでしたが、以下の設定を施していました。

  • パズルは100問解く必要がある。
  • 1つのパズルにつき10秒以内に解く必要がある。

解き方

このようなパズル問題はプログラミングの問題として既存の題材なので、実装するべきアルゴリズムだけでなく既存の Solver も利用することができます。あとは I/O 部分を今回の問題用に調整すれば解くことができました。

おわりに

当初の問題構想としてはもう少し難しい題材を考えていたのですが、Beginners 向けを想定しなくてはならなかったので、既存の題材 && 既存の Solver を使いまわせるような問題にしてみました。
CTF だけに限らず、複雑な問題を大量に処理しなくてはならないシチュエーションは多く存在しているので、プログラミングを用いて解決できるようにしておくと良いと思います。