SECCON 2016 Online CTF Write up PNG over Telegraph

  • 0
    いいね
  • 0
    コメント

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