SECCON 2018 Online CTF writeup (tctkToy)

チームTSGとして出場しました。5160点で2位でした。
僕個人ではタイトルの問題の途中まで解いただけで実質0点でした...一応役には立ったはず！

# tctkToy (Reversing 419Pts)
```
The tctkToy was a fragile Windows application toy. Reverse and repair it in order to work well. 
SUPPORT: Recommend using Windows10 machine to run successfully.
```

Windowsアプリケーションをリバーシングしながらtcl/tkを駆使してお手本に表示されたGUI画面を作ろう！という問題。IDAで解析すると次のような手順ののちにフラグが手に入ることがわかります。

1. コマンドライン引数に`1`を与えることで正常に起動させる
2. tclファイルをドラッグ&ドロップすることでそのスクリプトが実行される。
3. 実行後に4つのテストが走る。
    - プログラムのカレントディレクトリがtclスクリプトの実行前と実行後で異なり、かつ実行後ではC:\tctkToyにいる。
    - タスクマネージャーが起動している。
    - tctkROBOという名前のGUIウィンドウが存在する。
    - そのウィンドウ内にボタンが3つ配置されている。
4. テストが通れば、そのtclスクリプトの各行のはじめ2文字を取り出し繋げたものがSHA256に与えられる
5. ハッシュの先頭3byteが`a68361`であればそのハッシュがフラグ。

## tclプログラミング
カレントディレクトリのテストは`cd C:\\tctkToy`と記述すればよさそうです。タスクマネージャーのテストはあらかじめ起動しておくことでパスしました。(後から考えるとこれが大悪手だったようです。題意を考えればexecの類でテストを通すべきでした)
ウィンドウ名やボタンは、

```
wm title . tctkROBO
button .b1 -text "Go"
pack .b1
button .b2 -text "Back"
pack .b2
button .b3 -text "Stop"
pack .b3
```

とすればよさそうです。これで4つのテストは通ったのですが...

## ハッシュを見つける
テストは通るのですが、ハッシュのチェックが通らない。エラーメッセージは"お手本をちゃんと見て。pack命令は各ウィジェットにつき一個まで"としか書かれておらず、ここでしばらく止まってしまいました。そもそも、

- お手本を見る限り画像が挿入されているがlabelを使うのか？canvasを使うのか？
- `button pack button pack` ではなく`button button pack pack`でもテストは通るし見た目も変わらないしどっちが正しいのだろう？
- そもそも命令文はセミコロンでまとめられる

など、いろいろな別解があるにもかかわらず、SHAへの入力はスクリプトの各行先頭2文字をつなげたもの、という仕様のせいでかなりエスパー力を要する問題となっていました。メモリ領域やstrcat_sの引数から、ハッシュ計算に使われるスクリプトは12行分しかないことがわかっており、おそらく想定解も12行だろうという予想は立っていたのですが、あまりにもヒントが少なかったため正解が一向に見つかりませんでした。

## ヒントの投稿
ほかのプレイヤーも同じことを考えていたようで、公式IRCにも"Guessingすぎる"と文句を言っていた人がそこそこいたようです。そのうえ、ハッシュのバリデーションが先頭3バイトと小さかったためか、「テストも通りCongratsも表示されたのにフラグじゃない」(おそらくハッシュがぶつかったのでしょう)というプレイヤーも現れ、結局問題を再確認するという旨のアナウンスが公式より発表されました。

上の発表を見た後僕は寝てしまったのですが、その後に次のヒントが発表されました。

```
28th 10:00JST(28th 01:00UTC): [Announcement] We modified tctkToy challenge binary to make that process more rigorous.Please re-download and try again, sorry trouble you, challenge will release soon.
28th 10:02JST(28th 01:02UTC): [Announcement] tctkToy released again.
28th 11:00JST(28th 02:00UTC): [Hint] tctkToy: you can write a tcl file with just only "button", "exec", "cd", "wm", "canvas", "image" and "pack" command.
```

どうやらハッシュのチェックを6バイトに増やし、使用するコマンドも公開したようです。これをもとにチームメイトのhakatashiさんがハッシュ探索のプログラムを走らせてフラグを得ました。

```rust
extern crate sha2;
use sha2::{Sha256, Digest};

fn main() {
    let commands = [b"bu", b"ex", b"cd", b"wm", b"ca", b"im", b"pa"];
    for i in 0..7_u64.pow(12) {
        let mut hasher = Sha256::new();
        let mut remainder = i;
        for _j in 0..12 {
            hasher.input(commands[(remainder % 7) as usize]);
            remainder /= 7;
        }
        let hash = hasher.result();
        if hash[0] == 0xa6 &&
            hash[1] == 0x83 &&
            hash[2] == 0x61 &&
            hash[3] == 0x81 &&
            hash[4] == 0x84 &&
            hash[5] == 0xfc {
            println!("a683618184fc: {:?}", i);
        }
    }
}
```

`SECCON{a683618184fc18105b7157a52727d004681844be54fd792add4c90ff15a66e6f}`

## 感想・おまけ
エスパーが過ぎる。exec taskmgr.exeに気づかなかったのはこちらが悪いが、それでもやっぱりguessingな部分が多すぎると思いました。ヒントの内容も微妙で(問題の性質上こうするしかなかったのだろうが)、これだけわかってたら後はハッシュ回すだけじゃんとなったのもあまり面白くありませんでした。

以下はおまけです。



最終的なtclファイル

```tcl
cd C:\\tctkToy
exec dir
wm title . tctkROBO
canvas .c0
image create photo -file face.png
pack .c0
button .b1 -text "Go"
pack .b1
button .b2 -text "Back"
pack .b2
button .b3 -text "Stop"
pack .b3
```

当時のIRC

```
riatre [04:42]
seccon-admin: Sorry, I failed to see how tctkToy is not guessing. Could you please elaborate? I even get the "congratulations flag is SECCON{...}" MessageBox yet the flag is still not correct. Due to the nature of this challenge, there do exists multiply solutions, how can I get the correct one without guessing?
psrok1 [04:56]
I also think that tctkToy is just guessing
...(中略)
seccon-admin [06:37]
[Announcement] We're rechecking the tctkToy challenge.
...(中略)
seccon-admin [10:00]
[Announcement]We modified tctkToy challenge binary to make that process more rigorous.Please re-download and try again, sorry trouble you, challenge will release soon.
...(中略)
seccon-admin [10:02]
[Announcement] tctkToy released  again.
...(中略)
seccon-admin [11:11]
[HINT] tctkToy: you can write a tcl file with just only "button", "exec", "cd", "wm", "canvas", "image" and "pack" command.
riatre [11:29]
......
After guessing all night, this challenge now becomes a "hey I have GPU" challenge, I don't even

```