setodaNote

忘れる用のメモ書き for Cybersecurity

SECCON Beginners CTF 2020 Writeup

先日開催されていた Beginners CTF 2020 に一人で参加していました。

解いた問題について Writeup を記載します。


Welcome

問題文は以下の通り。

Welcome to SECCON Beginners CTF 2020!

フラグはSECCON BeginnersのDiscordサーバーの中にあります。 
また、質問の際は ctf4b-bot までDMにてお声がけください。

f:id:soji256:20200531094652p:plain:w400
問題文:Welcome

競技ルールが記載されているページに Discord の URL がある。アクセスするとフラグを見ることができる。

f:id:soji256:20200531095032p:plain
フラグ:Welcome

  • フラグ:ctf4b{sorry, we lost the ownership of our irc channel so we decided to use discord}

emoemoencode

以下のような問題文と共に、emoemoencode.txt というファイルが与えられる。

Do you know emo-emo-encode?
emoemoencode.txt

f:id:soji256:20200531095314p:plain:w400
問題文:emoemoencode

テキストエディタでファイルを開くと絵文字が並んでいる。見た目に楽しい。

f:id:soji256:20200531095532p:plain
emoemoencode.txt

暗号的なものっぽかったので「emoji crypt」などで検索してみる。

以下の画像のような、それらしいいくつかのサイトでしばらく試行錯誤してみるも、解けそうな感じがない。 *1

f:id:soji256:20200531232801p:plain
Codemoji – A fun tool to learn about ciphers

改めて文字を眺める。

f:id:soji256:20200531095532p:plain
emoemoencode.txt

もし1文字単位の換字式暗号なら最初の6文字は ctf4b{ と1対1対応になるはず。

実際、そう見てみると {} に相当する絵文字は他の個所で使われていない。なので本当にそうかも。

それなら文字の出現頻度で解けないかなーと、quipquip *2 にかけてみるも文章ではないので解けるわけもないとかけた後で気づく。

とりあえずバイナリエディタで眺める。

f:id:soji256:20200531234537p:plain
emoemoencode.txt-2586093c6d0bf61e0babf4d142c2418fb243b188

とてもきれいに揃っている感じがする。

ctf4{ と並べてみる。

f:id:soji256:20200603220738p:plain
文字列を比較する

繰り返し現れる F0 9F 8D を無視して比較すると

  • A363
  • B474

という感じで符合している感じがする。

さらによく比較すると

  • F0 9F 8D Ax -> 6x
  • F0 9F 8D Bx -> 7x
  • F0 9F 8C Bx -> 3x

といった規則が見える。

これを当てはめて単純に文字を置換していくと F0 9F 8D 9F というのが残る。

他の復号できた文字を見るとちょうど区切りの部分っぽいので _ つまり 5F とかかなと、あたりをつけて戻すことにする。

f:id:soji256:20200531235910p:plain
フラグ:emoemoencode

綺麗に戻った。

  • フラグ:ctf4b{stegan0graphy_by_em000000ji}

mask

以下のような問題文と共に、mask.zip というファイルが与えられる。

The price of mask goes down. So does the point (it's easy)!

(SHA-1 hash: c9da034834b7b699a7897d408bcb951252ff8f56)

f:id:soji256:20200601000830p:plain:w400
mask

とりあえず表層解析すると ELF ファイルと分かる。

f:id:soji256:20200601000900p:plain
mask の表層解析結果

IDA *3 で見てみる。

f:id:soji256:20200601000948p:plain
mask を IDA で見たところ

入力文字列を操作して結果を一定の文字列と比較しているっぽい。

ぱっと見で左に 75hAND が目立って見える。

そう思って見ると、右側にある atd4 で始まる文字列は ctf475hAND した結果と一致する。

特に考えず mask を実行してみて atd4 で始まる文字列をコピペして入力してみる。  
 
通らず。  
 

あきらめず IDA で目立っていたもう一つの c`b bk で始まる文字列を入れてみる。  
 

通らず。  
 

もう一度 IDA を見てみる。

すると、左側にもう一つの AND があることに気づく。

0FFFFFFEBh が値のよう。  
 
なるほど・・・。  
 
二つの AND 演算の結果が一致する文字列がフラグっぽい。

アルファベット abcdefghijklmnopqrstuvwxyz をそれぞれ 75hEBh で AND 演算した文字列を並べて置換表を作った。

f:id:soji256:20200601003336p:plain
フラグ:mask

フラグゲット。

  • フラグ:ctf4b{dont_reverse_face_mask}

yakisoba

以下のような問題文と共に、yakisoba.zip というファイルが与えられる。

Would you like to have a yakisoba code?

(Hint: You'd better automate your analysis)

f:id:soji256:20200602223412p:plain:w400
問題文:yakisoba

ヒントに自動解析とあるので、angr *4 使うのかなーと思う。

目的のアドレスと回避すべきアドレスを IDA で確認する。

f:id:soji256:20200602223534p:plain
yakisoba を IDA で見たところ

Wrong を避けつつ Correct を目指すようにセットして angr を走らせる。*5

cat angrYakisoba.py 
# python 3.5.2
# angr 8.19.4.5

import angr

p = angr.Project("./yakisoba")
state = p.factory.entry_state()
sim = p.factory.simulation_manager(state)
sim.explore(find=(0x400000+0x6d2,), avoid=(0x400000+0x6f7,))
if len(sim.found) > 0:
        print(sim.found[0].posix.dumps(0))

f:id:soji256:20200602223750p:plain
フラグ:yakisoba

フラグゲット。

  • フラグ:ctf4b{sp4gh3tt1_r1pp3r1n0}

参考文献

付録

問題ページの全景

f:id:soji256:20200603222644p:plain
問題ページの全景

感想

ひとつひとつの問題がそれぞれこう解くんだよと手法へ導いているようで、解いていて楽しかったです。pwn とかも他では見たことない優しい誘導があって、いいなーとなっておりました。 ひさしぶりでしたが CTF ってやっぱいいなーと思いながら解いていました。もっといろいろ解きたかった。。。

更新履歴

  • 2020/06/03 新規作成
  • 2020/06/04 更新履歴の新規作成日付が誤っていたのを修正(6/2 -> 6/3)。一部文言を修正。

*1:Codemoji – A fun tool to learn about ciphers https://codemoji.org/#/encrypt

*2:quipqiup - cryptoquip and cryptogram solver https://quipqiup.com/

*3:IDA Freeware Download Page – Hex Rays https://www.hex-rays.com/products/ida/support/download_freeware/

*4:angr/angr: A powerful and user-friendly binary analysis platform! https://github.com/angr/angr

*5:参考にさせていただいたプログラムの掲載サイト https://ox0xo.github.io/ctf/angrbeginner