#今年も懲りずに挑戦しました
今年も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を入れれば良いようだ。
では、ということで、昨年まとめておいたコマンドを使って、調査してみた。
まずは、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.
以上