バランスを取りたい

よくCTFの記事を書きます

きららフォワードCTF Writeup

発端はこれ。

QRコードといえばSECCONですが、このタイプの欠け方は今まで見たことがなかったのでチャレンジしてみました。 ちなみに今までCTFで出たQRコード問題は、

  • データ部分が完璧に残っている
  • エラー訂正部分がほぼ完璧に残っている
  • フォーマットデータが壊れている

の大体3種類です。

今回のQRコードはデータがちょっと欠けつつエラー部分はほぼ全滅、になっています。

まずはテキストに書き起こさないと始まらないので書き起こします。

XXXXXXX   X XXX X XXXXXXX
X     X X X    X  X     X
X XXX X     X  X  X XXX X
X XXX X XXX XX  X X XXX X
X XXX X  X    X X X XXX X
X     X XX XXX XX X     X
XXXXXXX X X X X X XXXXXXX
         XXX  X X
????????XX X  XX X X X X
????????? X X  XX  X   X
??????????X  XXXXX XXX XX
??????????? X   XX X    X
????????????X X  XX X XXX
????????????? X    X X X
??????????????XX X XXX XX
???????????????XXX XX   X
????????????????XXXXX X
????????????????X   XX
????????????????X X X XXX
????????????????X   XX XX
????????????????XXXXX XXX
?????????????????????XXXX
??????????????????????X X
??????????????????????? X
????????????????????????X

フォーマット部

フォーマットデータも半分くらい死んでますね。でもフォーマットデータは32パターンくらいしかないので適当に復元できます。

エラー訂正部

今回はエラーデータ部分がかなり欠落していてエラー訂正は無理でした。

エラー訂正も最大まで適用して30%ですが、今回はL(7%)なので到底ムリです。

データ部

今回のQRコードで一番残ってるエリアになります。 自作のツールに掛けてみるとこんなデータが出力されました。

[{'decoded': '', 'length_raw': '', 'raw': '0001010101101000011101000111010001110000011100110011101?????????????1111011001110110111101101111?????????????????????100001011110100011101111000011110000011001101000110010101?????????????????????????????????????????????0?00100011110110000010001111011000001000111??????', 'length': 268, 'mode': 'UNKNOWN', 'mode_raw': '0?00'}]

QRコードのデータで用いる符号化モードの属性が壊れてしまっています。

1ビットしか壊れていないので0か1になるはずですが、モード0000はデータの終了を意味するので1を入れることになります。

XXXXXXX   X XXX X XXXXXXX
X     X X X    X  X     X
X XXX X     X  X  X XXX X
X XXX X XXX XX  X X XXX X
X XXX X  X    X X X XXX X
X     X XX XXX XX X     X
XXXXXXX X X X X X XXXXXXX
         XXX  X X
????????XX X  XX X X X X
????????? X X  XX  X   X
??????????X  XXXXX XXX XX
??????????? X   XX X    X
????????????X X  XX X XXX
????????????? X    X X X
??????????????XX X XXX XX
???????????????XXX XX   X
????????????????XXXXX X
????????????????X   XX
????????????????X X X XXX
????????????????X   XX XX
????????????????XXXXX XXX
?????????????????????XXXX
??????????????????????X X
??????????????????????? X
???????????????????????XX

?に1を入れたときのデータはこうなりました。

再びツールに掛けるとURLっぽい文字列が出てきます。

[{'decoded': 'https???goo???/Gxx3F?', 'length_raw': '00010101', 'raw': '01101000011101000111010001110000011100110011101?????????????1111011001110110111101101111?????????????????????100001011110100011101111000011110000011001101000110010101??', 'length': 21, 'mode': '8BIT', 'mode_raw': '0100'}, {'decoded': '', 'length_raw': '', 'raw': '???????????????????????????????????????0?00100011110110000010001111011000001000111??????', 'length': 88, 'mode': 'UNKNOWN', 'mode_raw': '????'}]
https???goo???/Gxx3F?

このギリギリわかるようにURLが出てくる感じ、CTFみたいでテンションが上がりますね。

出てきたURLを見ると短縮URLでgoo.glを使っているだろうと推測できますが、肝心な最後の1文字が不明なので52通りの総当りが必要です。

もう一度ツールの出力を読むと、符号化モードは8BIT、rawデータの欠けている部分は2ビットです。 この部分を総当りすると4通りしかありません。

というわけで4通り総当りしてそれっぽいURLを救出すると、「空の隙間 -SKY BLUE DROP-」という漫画のカラーイラストを入手することができます。

まとめ

本編読んでないひとがこういうことすると急に文脈のわからないイラストが手に入ってしまって虚しい気持ちになります。好奇心は罪ですね。

大ヒント

解いた後にtyageさんがこんなツイートをRTしていましたが、これがあれば最後のguessingは必要なかったですね。