この記事はTSG Advent Calendar 2016 - Adventarの11日目の記事として書かれました
#問題
https://www.youtube.com/watch?v=Y6voaURtKlM
動画中のロボットのメッセージを解読してPNGファイルを手に入れる問題
#符号
ロボットは、棒の両端に腕が付いている構造をしていて、棒、腕の各部分が回転することができる
1秒ごとにロボットの姿勢が変わる
動画のはじめ1分に、メッセージを解読する映像が入っている
姿勢とアルファベットが一対一で対応していることがわかる
それを書き出してアルファベット順に並べてみると、法則が見えてくる
Jだけおかしいな…これと似たものに手旗信号があるが、それもJだけおかしいのでよいことにする
棒は45°ずつ8通りの方向に回転する
腕の形は5種類
この情報をもとに、動画の本体の部分を読んでいくと、32種類の姿勢が出てくることがわかる
Base32なのでは…?
ということで
以上のように対応すると考えた
数字とZはよくわからないので、あとで全探索しよう
Base32には0,1,8,9は登場しないのでたかだか7!通りである
#読み取り結果
手動でやりました…。3人がかりで、間違い探しを含めて延べ12時間位かかったのかな…。
RFIE4RYNBINAUAAAAAGUSSCEKIAAAAW2AAAAFWQBAMAAAABVEBTHAAAAAADFATCUIUAAAAHZZZZ2LWMZ3UAAAAACORJE4UZZZZELLX6HAAAAACLQJBMXGAAABMJAAAALCIA5FXL6ZQAAABWYJFCECVDYTTW5UQMS6I5AYRSRKVSQCLBJLPXSLMIAVL2BUS4ZUQAGZ4XDT7OQ62CI4KJUY7GJJKNZZYJQOBYHA4DQOBYHA4DQOBYHB4CPXDSTRXDZT7ZU6ZZI2DWZC66JZVYDX33GX5T7ZFZ4D3533RHDLCPIR27U5MCAOB6ZRDDYZJ3BW66NP6V75Y2U6LCDRZJWOUZJNZQOBYB36GEOHCXSXDB4FDZ4C7SEJZSD5NBCYE37JEAPCDI4DT6G64GP5GIW54Z2JTA7DFRT6IH22BTXVMHXA4HQHZDPWDRL3WHJSFRDQKZC5GLJDEOB7ZDP6D22OE5UAI6MND3WXIFHAG433RPCM7RRBUHA5PQR75I6DZ5PD6BMBQOBGZRHGRBQMZG77W65LPXGK6YN2C5OBVNJWJ3QUHA4PQJX5T5G6BMAQ4RVPAV2DMYNUV5WLKUOPPSRWIDQODYL36HIZWXHRL2LKZ7SSVQDJWYZUVTEV4K5DH72YHA4D5ZBDHLJC6H3KJ2YNK7677GW5XB2HZ5JTUV5QOBYG36GJ5K4KL3JHFTP5VFRR37FYME6L5VHC6DGZBPCNQGBYF36EWIVXOH5PKN7QN2ZPZTPYLLW44NZXOE5KQBHYDA4CNZBEPO4NYLRFS7ZJCHNXCQYEPU3KRKUPR6DQKBYH36EVURFVLPAR3UJDEKPK43E6566LZZXACAOB2ZB2N2T7MUZHMBS5URT5YR2253NPKWUKYOT3Z3XAIOBYZBHTYZRJ6OKX2FV7G24VOXFJFWQUPSRJ335N7KU7V3NYDA4D5ZA3V7BVHNF2FPBV5LR4HVDNDISPKG2VI6BYHATPYNTGNWGUSDVDNVH344X7ROVK5R6LXZJ7WI4DQOHYI46NUUNLUPDQRUVPO5GTP3LPZOT3U5Z724G4DQOBG3QSFJVH6CZ3JFY6KVG3U22GIVZW3ACOOBYZBDLYO56OO3WUNLU2ZMAFR4TLQLA7C7K3O2ZWBIHAZPYSW7WTZ7FEUYIYZZNMXVK465GCPEYJ3KHMFY4DR6CWPVSVJT2MHL33373L3ZUZTJ52YSXGF6VMMYLDQOHYL66YVXRLSKKY2FH75NCWLSZJOFOAFFNLEOIYHA4D5ZBZUVCOIT2PXVQAZYOKXH6542EKTPK4RD6TM3QIBYH36CUPELMKYZW37XL3T4OMHLCVWMLWWQ37ZKF2KLQODYE3OEKMT65PQ2P5V4YH3DEDTFUI7PE2GU3FS6SAEHA5PQPC5U3GXEOLWW3J5LNGSFLW7XOHL5BYJ6AYHA3PYMZF24HJBUPOEN2X3NOC2BEPLAQ3IN5XB7OGQ4DR6FZ4O5IHVN7WXE43VLATSWXKINPXMP2HXSOMD22FQGBYF36G4KBGWK5NGBTFPUPXWCNDG4YZHKDAQDQPX4BMZGPNTD3P7SFGWA336HPPWMQ5LSK5JANBYHL4E6PTGPBDLNAT5W56UKHM6KV3DPCLPZP7P5VAUOB7ZB3HSXVZI7GYWEXXZLTIM2ILMYVNRMWLK37HSLY4Q3XAADQPX4CVNTFNN7YTNFFKJC3X2TRS33323SGUCU3KX5M5BYFA4D5ZBSHSSD2WIR7F64L63LN6XFCPE5W2J7D2RDNSDA4DQJX4G4VDLK2XCJPCOK6WYPOKPWGNLIL3KHJQKBYH36D2VRUUMWORS7FU753ZGKOT677VJTRK43LX4GA4DV6CNLVHSMF6Z2WUTP7VKW5PWIXVCTL2J3IOBYPA3ZRVKKCH72GIWWQ3LMWQRF6NTWIH56LY3FV6EIOBYHA3PYLYYEFX5TOMBPDL6LTE2JLG4P7VILW2XMCLA4DQNX4KNM27TJLQNV65PWMZ625PONNMAFZS3IOBYHA3ZRB3VTRLCXL57OQJ23RXSUV2LRXCVDPHM4DR6DGZQJP4OTWO755QLRX7TLFIZ4YFFF3ZNFBYDA4DP6EOP5KLBGOUFQI5W4M2VQKYCZLSJOAGPXMUDA4DQLX4DY757T7GDE4VNGK7D6U5VNKKE6PNPF7A34KP4AHA4DZ6DWP5TVXKLWKNK22DLV5FBS642R7IX4PXBYSDIOB7ZC33Q6SHOWZ72SGN6MOEZLIKTGBKU4LW22GMT4MO6CEOBYPAXLYX7MBL2IK6CL5OO3KDH37WWKXX2ZOKI6GBFYHB4FNXDMWQICFGDLZIJCVKYVQZ74H2YC46EV22YCXA4HQLX4N7QP2MXOLK6NN3Q6BWTKVMVTW55UPEU2DQOHYS54M7LBXG73RX663ZS4U46EHZKI43JZIHPOTHA4HPKBIHA3PYU6XNMDT42WW46HT6F5EPYMZJF5X7PHWWHAMDQJX4EK6A23UFWOADZVIKPO2IORKTPLSM53EONYHB4DNZAEF7M77JFMZVKATLU7XXDN7ZPKUEAAOB2ZA3P54TWUS73K7ILDQ5NUGD7DYTPFSXGLI55Y6C44DR6CXPCGSAX265LSMYQ6H534S3KZMJMN4VTGAYHAZPYUK5QHGMV7NLTAZ76SPCCXF33KPN57MOWLQODYH26H4KC5I34LDDHVEVVIV6R3HQP2JKZKBTZVXQZLBI4DQ6BG3QQR5GPW52VC3V4L3AAN5XGX5ZVXIXHQOBYG36EOLS7ONG2KOXBVRETCF25OCHL6NWBIHAZZQWPCIF4ULFL4OIXQVYULO2VKY5IR32YAG256BYHA3PYPLJ4KMTORANLQ4WMN5MJOWORM6WUNNJCMX6ADQOBZZB3HVDQN4X2M6FZI4XNP3TM3Q7YBHXFO2LFXYHA4D5ZBZ62EAQOBYHA4DQOBYHA4DQOBYHP4MZ4APAUJSXHMRFZ7MAAAAAACJIVHEJLSCMCBA
しかし、このままBase32符号化しても、Zと数字が仮置きしたものだから正しい画像データは得られない
#置換
画像をpngcheckにかけて正しいと言われるまで、数字を置換します
ここで、正しい置換を発見するのにとても時間がかかりました…(データの誤植があったため)
4はpngのマジックナンバーから確定していたのでそれ以外を全探索して
# coding:utf-8
import base64
import itertools
import subprocess
repl = 'Z23567'
f = open("pre.txt").read().rstrip("\n")
s = 0
for i in list(itertools.permutations(repl)):
g = f.translate(str.maketrans(repl, ''.join(i)))
png = open("test.png", "wb")
png.write(base64.b32decode(g + "===="))
png.close()
check = subprocess.call(["pngcheck.exe", "test.png"])
if (not check):
break
s = s + 1
if __name__ == '__main__':
pass
以下が正しい置換
Z=>Z
2=>2
3=>7
5=>3
6=>5
7=>6
そして、QRコードが得られ、それを読めばFlagが得られる
フラグによると、ロボットの符号はセマフォア信号というもとからあるものだったらしい。
これを知っていれば全探索で苦戦することもなかったなぁ…。