SECCON CTFで出題したマインスイーパー問題

今年の2月、九州工業大学の飯塚キャンパスにて「第1回SECCON CTF福岡大会」有志のボランティアメンバーで開催しました。

P1090216.JPG

CTF(Capture The Flag)の競技大会の中では、セキュリティ技術(フォレンジック、暗号、リバースエンジニアリング、ネットワーク解析、Web脆弱性)にフォーカスしたものだけではなく、コンピュータ技術に関する幅広い知識や経験を問うこと言うことで、純粋にプログラミングに関する問題も出しているのですが、その中で、私の出題したPerlワンライナーの問題もこちらのブログで公開してみます。

■問題:マインスイーパー
改行コードがLFの以下の2つのファイルがあるとする。
(※CR LFでないことに注意)
$ cat 16x8.txt
................
................
....***.....***.
...**.*....**.*.
..**......**....
...*****...*****
...*.*.*...*.*.*
...*.***...*.***
$ cat minesweeper16.pl
#!perl -p0
s+\.+map/\e/g,$`.000000x3^($^x3).$_+eg
このファイルを実行すると以下の出力結果が得られる。
$ ./minesweeper16.pl < 16x8.txt
0000000000000000
0000000000000000
0000***00000***0
000**0*0000**0*0
00**000000**0000
000*****000*****
000*0*0*000*0*0*
000*0***000*0***
このとき、入力の*をマインスイーパーの爆弾のある場所と見立てて、
周辺にある爆弾の個数を数えて0~8の数字を出力するように
元のプログラムの一部を書き換えよ。
具体的には、以下の出力が得られるようにプログラムを修正せよ。
$ ./minesweeper16.pl < 16x8.txt > correct_answer
$ cat correct_answer
0000000000000000
0001232100012321
0013***20013***2
013**5*2013**5*2
01**654311**6543
014*****214*****
003*7*8*303*7*8*
002*4***202*4***
回答は、プログラム中の「000000」の箇所を置き換えた文字列を入力せよ。
ただし、入力行の幅は半角16文字+改行LF(1文字)で固定として良い。
置き換える文字列は7bit-ASCIIの印字可能な範囲内の文字とし、
複数の回答が考えられる場合は最短の文字列を正解とする。
同じ長さで複数回答が考えられる場合は、ASCIIの辞書順に
ソートし、若い方の回答を正解とする。
■ヒント
ヒント1:「000000」を「111111」に置き換えて実行してみよ
ヒント2:「000000」を「111e11」に置き換えて実行してみよ
ヒント3:「000000」を「555555」に置き換えて実行してみよ
ヒント4:1行目!#perl -p0 はどんな意味を持つか調べてみよ

実は、出題日と同日に発売された「Software Design 2012年3月号」のハック特集のページで、この問題の回答そのものが紹介されていたのですが、会場にいる参加者は誰も気づかなかったというヲチがありました。

自分の力で解いてみるのも面白いので、ある程度の期間が過ぎたら回答と解説のページを別途掲載するようにしてみたいと思います。

コメントは受け付けていません。