Help us understand the problem. What is going on with this article?

SECCON 2016 Online CTF Write up PNG over Telegraph

More than 3 years have passed since last update.

この記事はTSG Advent Calendar 2016 - Adventarの11日目の記事として書かれました

問題

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

符号

ロボットは、棒の両端に腕が付いている構造をしていて、棒、腕の各部分が回転することができる
1秒ごとにロボットの姿勢が変わる
動画のはじめ1分に、メッセージを解読する映像が入っている
姿勢とアルファベットが一対一で対応していることがわかる
それを書き出してアルファベット順に並べてみると、法則が見えてくる
PNG over Telegraph.jpg
Jだけおかしいな…これと似たものに手旗信号があるが、それもJだけおかしいのでよいことにする
棒は45°ずつ8通りの方向に回転する
腕の形は5種類
この情報をもとに、動画の本体の部分を読んでいくと、32種類の姿勢が出てくることがわかる
Base32なのでは…?
ということで
Slack for iOS Upload.jpg
以上のように対応すると考えた
数字とZはよくわからないので、あとで全探索しよう
Base32には0,1,8,9は登場しないのでたかだか7!通りである

読み取り結果

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

RFIE4RYNBINAUAAAAAGUSSCEKIAAAAW2AAAAFWQBAMAAAABVEBTHAAAAAADFATCUIUAAAAHZZZZ2LWMZ3UAAAAACORJE4UZZZZELLX6HAAAAACLQJBMXGAAABMJAAAALCIA5FXL6ZQAAABWYJFCECVDYTTW5UQMS6I5AYRSRKVSQCLBJLPXSLMIAVL2BUS4ZUQAGZ4XDT7OQ62CI4KJUY7GJJKNZZYJQOBYHA4DQOBYHA4DQOBYHB4CPXDSTRXDZT7ZU6ZZI2DWZC66JZVYDX33GX5T7ZFZ4D3533RHDLCPIR27U5MCAOB6ZRDDYZJ3BW66NP6V75Y2U6LCDRZJWOUZJNZQOBYB36GEOHCXSXDB4FDZ4C7SEJZSD5NBCYE37JEAPCDI4DT6G64GP5GIW54Z2JTA7DFRT6IH22BTXVMHXA4HQHZDPWDRL3WHJSFRDQKZC5GLJDEOB7ZDP6D22OE5UAI6MND3WXIFHAG433RPCM7RRBUHA5PQR75I6DZ5PD6BMBQOBGZRHGRBQMZG77W65LPXGK6YN2C5OBVNJWJ3QUHA4PQJX5T5G6BMAQ4RVPAV2DMYNUV5WLKUOPPSRWIDQODYL36HIZWXHRL2LKZ7SSVQDJWYZUVTEV4K5DH72YHA4D5ZBDHLJC6H3KJ2YNK7677GW5XB2HZ5JTUV5QOBYG36GJ5K4KL3JHFTP5VFRR37FYME6L5VHC6DGZBPCNQGBYF36EWIVXOH5PKN7QN2ZPZTPYLLW44NZXOE5KQBHYDA4CNZBEPO4NYLRFS7ZJCHNXCQYEPU3KRKUPR6DQKBYH36EVURFVLPAR3UJDEKPK43E6566LZZXACAOB2ZB2N2T7MUZHMBS5URT5YR2253NPKWUKYOT3Z3XAIOBYZBHTYZRJ6OKX2FV7G24VOXFJFWQUPSRJ335N7KU7V3NYDA4D5ZA3V7BVHNF2FPBV5LR4HVDNDISPKG2VI6BYHATPYNTGNWGUSDVDNVH344X7ROVK5R6LXZJ7WI4DQOHYI46NUUNLUPDQRUVPO5GTP3LPZOT3U5Z724G4DQOBG3QSFJVH6CZ3JFY6KVG3U22GIVZW3ACOOBYZBDLYO56OO3WUNLU2ZMAFR4TLQLA7C7K3O2ZWBIHAZPYSW7WTZ7FEUYIYZZNMXVK465GCPEYJ3KHMFY4DR6CWPVSVJT2MHL33373L3ZUZTJ52YSXGF6VMMYLDQOHYL66YVXRLSKKY2FH75NCWLSZJOFOAFFNLEOIYHA4D5ZBZUVCOIT2PXVQAZYOKXH6542EKTPK4RD6TM3QIBYH36CUPELMKYZW37XL3T4OMHLCVWMLWWQ37ZKF2KLQODYE3OEKMT65PQ2P5V4YH3DEDTFUI7PE2GU3FS6SAEHA5PQPC5U3GXEOLWW3J5LNGSFLW7XOHL5BYJ6AYHA3PYMZF24HJBUPOEN2X3NOC2BEPLAQ3IN5XB7OGQ4DR6FZ4O5IHVN7WXE43VLATSWXKINPXMP2HXSOMD22FQGBYF36G4KBGWK5NGBTFPUPXWCNDG4YZHKDAQDQPX4BMZGPNTD3P7SFGWA336HPPWMQ5LSK5JANBYHL4E6PTGPBDLNAT5W56UKHM6KV3DPCLPZP7P5VAUOB7ZB3HSXVZI7GYWEXXZLTIM2ILMYVNRMWLK37HSLY4Q3XAADQPX4CVNTFNN7YTNFFKJC3X2TRS33323SGUCU3KX5M5BYFA4D5ZBSHSSD2WIR7F64L63LN6XFCPE5W2J7D2RDNSDA4DQJX4G4VDLK2XCJPCOK6WYPOKPWGNLIL3KHJQKBYH36D2VRUUMWORS7FU753ZGKOT677VJTRK43LX4GA4DV6CNLVHSMF6Z2WUTP7VKW5PWIXVCTL2J3IOBYPA3ZRVKKCH72GIWWQ3LMWQRF6NTWIH56LY3FV6EIOBYHA3PYLYYEFX5TOMBPDL6LTE2JLG4P7VILW2XMCLA4DQNX4KNM27TJLQNV65PWMZ625PONNMAFZS3IOBYHA3ZRB3VTRLCXL57OQJ23RXSUV2LRXCVDPHM4DR6DGZQJP4OTWO755QLRX7TLFIZ4YFFF3ZNFBYDA4DP6EOP5KLBGOUFQI5W4M2VQKYCZLSJOAGPXMUDA4DQLX4DY757T7GDE4VNGK7D6U5VNKKE6PNPF7A34KP4AHA4DZ6DWP5TVXKLWKNK22DLV5FBS642R7IX4PXBYSDIOB7ZC33Q6SHOWZ72SGN6MOEZLIKTGBKU4LW22GMT4MO6CEOBYPAXLYX7MBL2IK6CL5OO3KDH37WWKXX2ZOKI6GBFYHB4FNXDMWQICFGDLZIJCVKYVQZ74H2YC46EV22YCXA4HQLX4N7QP2MXOLK6NN3Q6BWTKVMVTW55UPEU2DQOHYS54M7LBXG73RX663ZS4U46EHZKI43JZIHPOTHA4HPKBIHA3PYU6XNMDT42WW46HT6F5EPYMZJF5X7PHWWHAMDQJX4EK6A23UFWOADZVIKPO2IORKTPLSM53EONYHB4DNZAEF7M77JFMZVKATLU7XXDN7ZPKUEAAOB2ZA3P54TWUS73K7ILDQ5NUGD7DYTPFSXGLI55Y6C44DR6CXPCGSAX265LSMYQ6H534S3KZMJMN4VTGAYHAZPYUK5QHGMV7NLTAZ76SPCCXF33KPN57MOWLQODYH26H4KC5I34LDDHVEVVIV6R3HQP2JKZKBTZVXQZLBI4DQ6BG3QQR5GPW52VC3V4L3AAN5XGX5ZVXIXHQOBYG36EOLS7ONG2KOXBVRETCF25OCHL6NWBIHAZZQWPCIF4ULFL4OIXQVYULO2VKY5IR32YAG256BYHA3PYPLJ4KMTORANLQ4WMN5MJOWORM6WUNNJCMX6ADQOBZZB3HVDQN4X2M6FZI4XNP3TM3Q7YBHXFO2LFXYHA4D5ZBZ62EAQOBYHA4DQOBYHA4DQOBYHP4MZ4APAUJSXHMRFZ7MAAAAAACJIVHEJLSCMCBA

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

置換

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

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が得られる
フラグによると、ロボットの符号はセマフォア信号というもとからあるものだったらしい。
これを知っていれば全探索で苦戦することもなかったなぁ…。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away