Seccon beginners ctf 2020 write up (mask)

#今年も懲りずに挑戦しました
今年もSeccon Beginners ctf 2020に挑戦しました。まあ、だいたい解けなかったわけですが、1問だけ自力で解けたのでWriteUPを書きます。

## mask
難易度は"beginner"。問題のzipファイルを解答すると、maskというファイルが出てくる。これを解析することになる。

まず、これは何？ということで、```file```コマンドを使って調べてみると

```
$ file mask
mask: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=49166a467aee16fbfe167daf372d3263837b4887, for GNU/Linux 3.2.0, not stripped
```
ということで、Linuxの実行ファイルであることがわかる。

では、とりあえず実行してみると

```
$ ./mask 
Usage: ./mask [FLAG]
```
となっていて、いきなりFLAGを入れれば良いようだ。

では、ということで、[昨年まとめておいたコマンド](https://qiita.com/dolcano/items/94791d3be91092922115)を使って、調査してみた。
まずは、```strings```を使用してみる。（結果的には、今回これだけでなんとかなった）

```
$ strings mask
/lib64/ld-linux-x86-64.so.2
7-2c
libc.so.6
strcpy
puts
__stack_chk_fail
strlen
__cxa_finalize

ーー略ーー
```
こんな感じででてくる。この中に**ctf4g{hogehoge}**っていう文字列があればよかったのだが、流石にそこまで簡単ではない。

## 少し考えてみた
FLAGは**ctf4g{hogehote}**である。なので、適当に入れてみよう。

```
$ ./mask ctf4b{hogehoge}
Putting on masks...
atd4`q`eee`eeeu
c`b bkhkcahkcai
Wrong FLAG. Try again.
```
こんな感じで間違っていると怒られる。これを何度実行しても、同じ文言が出てくる。
そこで、

```
$ ./mask abcdefghijklmnopqrstuvwxyz
Putting on masks...
a`adede`a`adedepqpqtutupqp
abc`abchijkhijk`abc`abchij
Wrong FLAG. Try again.
```
とやってみると、"c","t","f"の位置に、上下で”ac”,"t`","db"となっていることがわかる。
同様に、英語大文字と"{}"を入力してみる。

```
$ ./mask ABCDEFGHIJKLMNOPQRSTUVWXYZ
Putting on masks...
A@ADEDE@A@ADEDEPQPQTUTUPQP
ABC@ABCHIJKHIJK@ABC@ABCHIJ
Wrong FLAG. Try again.

$ ./mask {}
Putting on masks...
qu
ki
Wrong FLAG. Try again.
```
となることがわかった。

ここで、もう一度```strings```の出力の中に、"ctf4b{"がエンコードされた文字列が無いか調べてみた。

```
$ strings ./mask | grep atd
atd4`qdedtUpetepqeUdaaeUeaqau
```
あるじゃん。

実はここまではすぐ見つけたのだが、次に気がつくまでに時間がかかった。
迷い込んだのは、2行あるうちの上の行しか考慮しなかったことによる。

例えばエンコードされた文字が"a"の場合、もとの文字は"a","c","i","k"の4文字ある。
なので、これらの組み合わせを考えるのだろうと思い、クロスワードパズルで単語が出てくるサイトなどを調べていたのだが、ことごとく外れた。

そこで、もう一度考え直して、下の段にも意味があるのであろうということで、"ctf4b"に対応する下の段もあるのだろうと思って、"c"の文字が入っているものを出力してみた。

```
$ strings ./mask | grep c
7-2c
libc.so.6
strcpy
__stack_chk_fail
__cxa_finalize
strcmp
__libc_start_main
c`b bk`kj`KbababcaKbacaKiacki
Correct! Submit your FLAG.
GCC: (Arch Linux 9.3.0-1) 9.3.0
init.c
crtstuff.c
deregister_tm_clones
completed.7393
mask.c
__libc_csu_fini
strcpy@@GLIBC_2.2.5
__stack_chk_fail@@GLIBC_2.4
__libc_start_main@@GLIBC_2.2.5
strcmp@@GLIBC_2.2.5
__libc_csu_init
__cxa_finalize@@GLIBC_2.2.5
.dynamic
.comment
```
この中に、```c`b bk`kj`KbababcaKbacaKiacki```という文字列がある。
```ctf4b```をmaskに与えたときに出てくる、```c`b b```が入っている。
文字数も、上の段と一緒なので、これがエンコードされた下の段であることがわかる。

```
atd4`qdedtUpetepqeUdaaeUeaqau
c`b bk`kj`KbababcaKbacaKiacki
```
ここまでくれば、あとは、上の段と下の段の組み合わせの文字が何なのかをアルファベットから見つければよい。

例えば、小文字のアルファベットだけ並べてみると、

```
abcdefghijklmnopqrstuvwxyz
a`adede`a`adedepqpqtutupqp
abc`abchijkhijk`abc`abchij
```

また、上の段と下の段が"ui"なら、"}"である。
1文字ずつ調べていくと、

```
atd4`qdedtUpetepqeUdaaeUeaqau
c`b bk`kj`KbababcaKbacaKiacki
ctf?b{dont?reverse?face?mask}
```

となる。（"?"はまだ見つかっていない文字）

途中、"UK"という組み合わせが出てくるが、この前後で単語がきちんと意味をなしていることから、
これは何かの記号だろうと思ったので、とりあえず"_"をmaskでエンコードしてみたら、

```
$ ./mask _
Putting on masks...
U
K
Wrong FLAG. Try again.

```
勘が冴えていた。
また、数字もmaskでエンコードしてあげると、

```
$ ./mask 1234567890
Putting on masks...
1014545010
!"# !"#() 
Wrong FLAG. Try again.

```
全部の組み合わせがみつかった。

flagは```ctf4b{dont_reverse_face_mask}```

```
$ ./mask ctf4b{dont_reverse_face_mask}
Putting on masks...
atd4`qdedtUpetepqeUdaaeUeaqau
c`b bk`kj`KbababcaKbacaKiacki
Correct! Submit your FLAG.
```

以上