SECCON 2016 Online CTF Write up PNG over Telegraph

この記事は[TSG Advent Calendar 2016 - Adventar](http://www.adventar.org/calendars/1615)の11日目の記事として書かれました

#問題
https://www.youtube.com/watch?v=Y6voaURtKlM
動画中のロボットのメッセージを解読してPNGファイルを手に入れる問題

#符号
ロボットは、棒の両端に腕が付いている構造をしていて、棒、腕の各部分が回転することができる
1秒ごとにロボットの姿勢が変わる
動画のはじめ1分に、メッセージを解読する映像が入っている
姿勢とアルファベットが一対一で対応していることがわかる
それを書き出してアルファベット順に並べてみると、法則が見えてくる
![PNG over Telegraph.jpg](https://qiita-image-store.s3.amazonaws.com/0/74646/70afacf1-6f98-9822-abdb-3345b7391280.jpeg)
Jだけおかしいな…これと似たものに[手旗信号](https://ja.wikipedia.org/wiki/%E6%89%8B%E6%97%97%E4%BF%A1%E5%8F%B7#.E6.AC.A7.E6.96.87.E6.89.8B.E6.97.97.E4.BF.A1.E5.8F.B7)があるが、それもJだけおかしいのでよいことにする
棒は45°ずつ8通りの方向に回転する
腕の形は5種類
この情報をもとに、動画の本体の部分を読んでいくと、32種類の姿勢が出てくることがわかる
Base32なのでは…？
ということで
![Slack for iOS Upload.jpg](https://qiita-image-store.s3.amazonaws.com/0/74646/14c1e6d9-fea0-aa55-4c12-422d5135ef08.jpeg)
以上のように対応すると考えた
数字とZはよくわからないので、あとで全探索しよう
Base32には0,1,8,9は登場しないのでたかだか7！通りである

#読み取り結果
手動でやりました…。3人がかりで、間違い探しを含めて延べ12時間位かかったのかな…。

>RFIE4RYNBINAUAAAAAGUSSCEKIAAAAW2AAAAFWQBAMAAAABVEBTHAAAAAADFATCUIUAAAAHZZZZ2LWMZ3UAAAAACORJE4UZZZZELLX6HAAAAACLQJBMXGAAABMJAAAALCIA5FXL6ZQAAABWYJFCECVDYTTW5UQMS6I5AYRSRKVSQCLBJLPXSLMIAVL2BUS4ZUQAGZ4XDT7OQ62CI4KJUY7GJJKNZZYJQOBYHA4DQOBYHA4DQOBYHB4CPXDSTRXDZT7ZU6ZZI2DWZC66JZVYDX33GX5T7ZFZ4D3533RHDLCPIR27U5MCAOB6ZRDDYZJ3BW66NP6V75Y2U6LCDRZJWOUZJNZQOBYB36GEOHCXSXDB4FDZ4C7SEJZSD5NBCYE37JEAPCDI4DT6G64GP5GIW54Z2JTA7DFRT6IH22BTXVMHXA4HQHZDPWDRL3WHJSFRDQKZC5GLJDEOB7ZDP6D22OE5UAI6MND3WXIFHAG433RPCM7RRBUHA5PQR75I6DZ5PD6BMBQOBGZRHGRBQMZG77W65LPXGK6YN2C5OBVNJWJ3QUHA4PQJX5T5G6BMAQ4RVPAV2DMYNUV5WLKUOPPSRWIDQODYL36HIZWXHRL2LKZ7SSVQDJWYZUVTEV4K5DH72YHA4D5ZBDHLJC6H3KJ2YNK7677GW5XB2HZ5JTUV5QOBYG36GJ5K4KL3JHFTP5VFRR37FYME6L5VHC6DGZBPCNQGBYF36EWIVXOH5PKN7QN2ZPZTPYLLW44NZXOE5KQBHYDA4CNZBEPO4NYLRFS7ZJCHNXCQYEPU3KRKUPR6DQKBYH36EVURFVLPAR3UJDEKPK43E6566LZZXACAOB2ZB2N2T7MUZHMBS5URT5YR2253NPKWUKYOT3Z3XAIOBYZBHTYZRJ6OKX2FV7G24VOXFJFWQUPSRJ335N7KU7V3NYDA4D5ZA3V7BVHNF2FPBV5LR4HVDNDISPKG2VI6BYHATPYNTGNWGUSDVDNVH344X7ROVK5R6LXZJ7WI4DQOHYI46NUUNLUPDQRUVPO5GTP3LPZOT3U5Z724G4DQOBG3QSFJVH6CZ3JFY6KVG3U22GIVZW3ACOOBYZBDLYO56OO3WUNLU2ZMAFR4TLQLA7C7K3O2ZWBIHAZPYSW7WTZ7FEUYIYZZNMXVK465GCPEYJ3KHMFY4DR6CWPVSVJT2MHL33373L3ZUZTJ52YSXGF6VMMYLDQOHYL66YVXRLSKKY2FH75NCWLSZJOFOAFFNLEOIYHA4D5ZBZUVCOIT2PXVQAZYOKXH6542EKTPK4RD6TM3QIBYH36CUPELMKYZW37XL3T4OMHLCVWMLWWQ37ZKF2KLQODYE3OEKMT65PQ2P5V4YH3DEDTFUI7PE2GU3FS6SAEHA5PQPC5U3GXEOLWW3J5LNGSFLW7XOHL5BYJ6AYHA3PYMZF24HJBUPOEN2X3NOC2BEPLAQ3IN5XB7OGQ4DR6FZ4O5IHVN7WXE43VLATSWXKINPXMP2HXSOMD22FQGBYF36G4KBGWK5NGBTFPUPXWCNDG4YZHKDAQDQPX4BMZGPNTD3P7SFGWA336HPPWMQ5LSK5JANBYHL4E6PTGPBDLNAT5W56UKHM6KV3DPCLPZP7P5VAUOB7ZB3HSXVZI7GYWEXXZLTIM2ILMYVNRMWLK37HSLY4Q3XAADQPX4CVNTFNN7YTNFFKJC3X2TRS33323SGUCU3KX5M5BYFA4D5ZBSHSSD2WIR7F64L63LN6XFCPE5W2J7D2RDNSDA4DQJX4G4VDLK2XCJPCOK6WYPOKPWGNLIL3KHJQKBYH36D2VRUUMWORS7FU753ZGKOT677VJTRK43LX4GA4DV6CNLVHSMF6Z2WUTP7VKW5PWIXVCTL2J3IOBYPA3ZRVKKCH72GIWWQ3LMWQRF6NTWIH56LY3FV6EIOBYHA3PYLYYEFX5TOMBPDL6LTE2JLG4P7VILW2XMCLA4DQNX4KNM27TJLQNV65PWMZ625PONNMAFZS3IOBYHA3ZRB3VTRLCXL57OQJ23RXSUV2LRXCVDPHM4DR6DGZQJP4OTWO755QLRX7TLFIZ4YFFF3ZNFBYDA4DP6EOP5KLBGOUFQI5W4M2VQKYCZLSJOAGPXMUDA4DQLX4DY757T7GDE4VNGK7D6U5VNKKE6PNPF7A34KP4AHA4DZ6DWP5TVXKLWKNK22DLV5FBS642R7IX4PXBYSDIOB7ZC33Q6SHOWZ72SGN6MOEZLIKTGBKU4LW22GMT4MO6CEOBYPAXLYX7MBL2IK6CL5OO3KDH37WWKXX2ZOKI6GBFYHB4FNXDMWQICFGDLZIJCVKYVQZ74H2YC46EV22YCXA4HQLX4N7QP2MXOLK6NN3Q6BWTKVMVTW55UPEU2DQOHYS54M7LBXG73RX663ZS4U46EHZKI43JZIHPOTHA4HPKBIHA3PYU6XNMDT42WW46HT6F5EPYMZJF5X7PHWWHAMDQJX4EK6A23UFWOADZVIKPO2IORKTPLSM53EONYHB4DNZAEF7M77JFMZVKATLU7XXDN7ZPKUEAAOB2ZA3P54TWUS73K7ILDQ5NUGD7DYTPFSXGLI55Y6C44DR6CXPCGSAX265LSMYQ6H534S3KZMJMN4VTGAYHAZPYUK5QHGMV7NLTAZ76SPCCXF33KPN57MOWLQODYH26H4KC5I34LDDHVEVVIV6R3HQP2JKZKBTZVXQZLBI4DQ6BG3QQR5GPW52VC3V4L3AAN5XGX5ZVXIXHQOBYG36EOLS7ONG2KOXBVRETCF25OCHL6NWBIHAZZQWPCIF4ULFL4OIXQVYULO2VKY5IR32YAG256BYHA3PYPLJ4KMTORANLQ4WMN5MJOWORM6WUNNJCMX6ADQOBZZB3HVDQN4X2M6FZI4XNP3TM3Q7YBHXFO2LFXYHA4D5ZBZ62EAQOBYHA4DQOBYHA4DQOBYHP4MZ4APAUJSXHMRFZ7MAAAAAACJIVHEJLSCMCBA

しかし、このままBase32符号化しても、Zと数字が仮置きしたものだから正しい画像データは得られない

#置換
画像を[pngcheck](http://www.libpng.org/pub/png/apps/pngcheck.html)にかけて正しいと言われるまで、数字を置換します
ここで、正しい置換を発見するのにとても時間がかかりました…（データの誤植があったため）
4はpngのマジックナンバーから確定していたのでそれ以外を全探索して

```py3:make.py
# 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が得られる
フラグによると、ロボットの符号は[セマフォア信号](https://en.wikipedia.org/wiki/Semaphore_line#Technical_operation)というもとからあるものだったらしい。
これを知っていれば全探索で苦戦することもなかったなぁ…。