1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Seccon beginners ctf 2020 write up (mask)

Last updated at Posted at 2020-05-24

#今年も懲りずに挑戦しました
今年も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.

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?