はじめに ... #SECCON 令和 CTF WriteUp
平成の終わりから令和の初めにかけて行われたCTF、と書くとずいぶんと長く感じる。
平成31年4月30日23時から令和元年5月1日2時までの行われていたCTFでした。
開始直後はサーバートラブル等でまともにアクセスできず、これが高度なネットワーク問題や問題見られずに大会終了などと言われていたりした。
3問解いて 210pt, 112th.
Misc
フラグの例は?
ウェルカム問題、フラグ形式の説明。例示されたフラグを入力するだけ。
今回のCTFで最も難しかった問題
bREinWAck (100pt)
問題
元号が変わる。記号も変わる。
参考: https://ja.wikipedia.org/wiki/Brainfuck
令和和和和和和和和和和和和和和和和「令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成」令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。
問題文からBrainfuckなのが明らか。
Brainfuckの言語仕様は以下のとおり。
命令 | 機能 |
---|---|
> |
ポインタをインクリメントする。 |
< |
ポインタをデクリメントする。 |
+ |
ポインタが指す値をインクリメントする。 |
- |
ポインタが指す値をデクリメントする。 |
. |
ポインタが指す値を出力に書き出す。 |
, |
入力から1バイト読み込んで、ポインタが指す先に代入する。 |
[ |
ポインタが指す値が0なら、対応する ] にジャンプする。 |
] |
ポインタが指す値が0でないなら、対応する [ にジャンプする。 |
与えられたコード中の「
」
。
は、出現位置・頻度からそれぞれ[
]
.
に対応すると仮定した。
この上で残る令
和
平
成
の四文字について考える。
-
令
: ほかの三文字と比較すると出現回数が少ない事から>
-
和
: 出現回数の多さとその連続性から+
-
平
: ほかの三文字と比較すると出現回数が少ない事や、令和・平成の対応から<
-
成
: 出現回数の多さとその連続性、令和・平成の対応から-
あとは対応する文字を変更したうえで、Brainfuckの処理系に入力して確認。
flag : SECCON{bREIn_WAnic!}
初めてのBrainFuck系列の問題だった。エスパーで解いた、と言われるものなので総当たりのコードを書くべきだったかもしれない。
BrainfuckのWEBインタプリタなんて存在するんですね。知らなかった。
Web
reiwaVote (100pt)
問題
「令和」を新元号として選出せよ!
(WEBサーバー+SQLのzipファイルが配布される)
「投票する」を選択するとブラウザが立ち上がり投票サイトへのログイン画面が表示される。WEB問題なのでSQL injectionかと思いuser idを ' or 1=1 --
として登録。
injection が成功しユーザが shinzo
になり、「令和」へ投票。投票順位において「令和」が一位となり、投票締め切りをするとflagゲット.
flag: SECCON{e32afd2cf7b98e41cf70fed}
ほかの方のWriteupを見ていると、内部で実行されているSQL文が次のようになっているらしい。
UPDATE tblUsers SET Importance=(SELECT COUNT(*) FROM tblUsers) WHERE User='shinzo';
SELECT GengoId, EraE, EraJ, SUM(Importance) AS Votes FROM tblVotes v, tblUsers u, tblEras e WHERE v.UserId=u.Id AND v.GengoId=e.Id GROUP BY GengoId ORDER BY Votes DESC;
Forensic
新元号発表 (100pt)
問題
見えないよ!
時間切れでできなかった。
(追記: 2019/05/02)
終了後に解けた。
配布されたPDF中の画像を抽出し、「令和」と切り抜かれたQRコードの部分へ隠れている切り抜き部分を重ねればいい。
(Adobe やPDFからpptxへの変換ソフトなどでも抽出はできるはず)
flag: SECCON{overlay_overlap_overera}
最初辺、見えているQRコードから復元できるのかと思っていた。SECCONではQRは伝統なのだから、もっと学ぶべきだなあと思う。
別の方法として binwalk
コマンドの存在を初めて知った。pdfの解析が簡単にできるのね。
QRazyBoxなるWEBアプリケーションで、QR復元もできるらしい。以下は虫食いQRのQRazyBoxでの解析結果。
QR version : 4 (33x33)
Error correction level : M
Mask pattern : 2
Number of missing bytes (erasures) : 0 bytes (0.00%)
Data blocks :
["01000000","01010111","10110101","00100110","01000110","11000110","10000110","00010111","01010010","00000101","00000110","11110110","01100110","11110111","11000110","01100110","00010110","01010111","01110010","00100110","00000110","01010111","10000000","00000100","00010010","00010111","00000011","11010000","11100111","11101100","00101101","10111011","10100100","10101010","10101010","10101010","10010111","11100000","01000001","00010001","10000001","11100000","10100000","00000001","01110111","11100101","01110111","01010001","01010111","01010101","01010101","01010101","01000110","11101000","00011111","10011011","10011111","10101010","10101010","00110010","10110111","11101000","00000100","00010001","11000000","00000000","00000000","00010000","00000100","11011101","01010101","01010101","01010101","01111100","11010101","01010111","00011101","10101000","10001000","11111001","11100111","10100000","10101000","00101000","10011101","00101000","01100101","10111010","10001100","01000110","10100110","01100110","01101011","11111110","10000100","10111010","01101011","11010010","10001000","11001100"]
Final data bits :
01000000101101010100011010000110010100100000011001100110110001100001011001110010000001101000000000010010000000111110011100101101101001001010101010010111010000011000000110100000011101110111011101010111010101010100011000011111100111111010101010110111000001000101011100100110110001100001011100000101111101101111011101100110010101110010011001010111000001000001011111010000111011001011101110101010101010101110000000010001111000000000000111100101010100010101010101010101111010001001101110101010001100101110100000010001
[0100] [00001011] [0101010001101101000011011001010010010000001101100110011011011000110110000101101100111001001000000110110100000000000001001]
Mode Indicator : 8-bit Mode (0100)
Character Count Indicator : 11
Decoded data : The flag h
[0010] [000000111] [110011100101101101001001010101010010111]
Mode Indicator : Alphanumeric Mode (0010)
Character Count Indicator : 7
Decoded data : U% F7N
[0100] [00011000] [000110100000000011101101110111011011101010110111010101001010100011011000011111111100111111111010101101010110110111000001001000101011011100100110110110001101100001011011100000100101111101101101111011011101100110110010101101110010011011001010110111000001001000001011]
Mode Indicator : 8-bit Mode (0100)
Character Count Indicator : 24
Decoded data : wuuTaùú«pErlap_overepA
Final Decoded string : The flag h U% F7NwuuTaùú«pErlap_overepA
The flag h U% F7NwuuTaùú«pErlap_overepA
の一文が見えている。