先日開催されていた Beginners CTF 2020 に一人で参加していました。
Beginners CTF 2020(サイト閉鎖済み)
https://score.beginners.seccon.jp/SECCON Beginners CTF 2020 結果 - SECCON2020
https://www.seccon.jp/2020/seccon_beginners/seccon_beginners_ctf_2020.html
解いた問題について Writeup を記載します。
Welcome
問題文は以下の通り。
Welcome to SECCON Beginners CTF 2020! フラグはSECCON BeginnersのDiscordサーバーの中にあります。 また、質問の際は ctf4b-bot までDMにてお声がけください。
競技ルールが記載されているページに Discord の URL がある。アクセスするとフラグを見ることができる。
- フラグ:
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
テキストエディタでファイルを開くと絵文字が並んでいる。見た目に楽しい。
暗号的なものっぽかったので「emoji crypt」などで検索してみる。
以下の画像のような、それらしいいくつかのサイトでしばらく試行錯誤してみるも、解けそうな感じがない。 *1
改めて文字を眺める。
もし1文字単位の換字式暗号なら最初の6文字は ctf4b{
と1対1対応になるはず。
実際、そう見てみると {
と }
に相当する絵文字は他の個所で使われていない。なので本当にそうかも。
それなら文字の出現頻度で解けないかなーと、quipquip *2 にかけてみるも文章ではないので解けるわけもないとかけた後で気づく。
とりあえずバイナリエディタで眺める。
とてもきれいに揃っている感じがする。
ctf4{
と並べてみる。
繰り返し現れる F0 9F 8D
を無視して比較すると
A3
と63
B4
と74
という感じで符合している感じがする。
さらによく比較すると
F0 9F 8D Ax
->6x
F0 9F 8D Bx
->7x
F0 9F 8C Bx
->3x
といった規則が見える。
これを当てはめて単純に文字を置換していくと F0 9F 8D 9F
というのが残る。
他の復号できた文字を見るとちょうど区切りの部分っぽいので _
つまり 5F
とかかなと、あたりをつけて戻すことにする。
綺麗に戻った。
- フラグ:
ctf4b{stegan0graphy_by_em000000ji}
mask
以下のような問題文と共に、mask.zip というファイルが与えられる。
The price of mask goes down. So does the point (it's easy)! (SHA-1 hash: c9da034834b7b699a7897d408bcb951252ff8f56)
とりあえず表層解析すると ELF ファイルと分かる。
IDA *3 で見てみる。
入力文字列を操作して結果を一定の文字列と比較しているっぽい。
ぱっと見で左に 75h
と AND
が目立って見える。
そう思って見ると、右側にある atd4
で始まる文字列は ctf4
に 75h
を AND
した結果と一致する。
特に考えず mask を実行してみて atd4
で始まる文字列をコピペして入力してみる。
通らず。
あきらめず IDA で目立っていたもう一つの c`b bk
で始まる文字列を入れてみる。
通らず。
もう一度 IDA を見てみる。
すると、左側にもう一つの AND
があることに気づく。
0FFFFFFEBh
が値のよう。
なるほど・・・。
二つの AND 演算の結果が一致する文字列がフラグっぽい。
アルファベット abcdefghijklmnopqrstuvwxyz
をそれぞれ 75h
と EBh
で AND 演算した文字列を並べて置換表を作った。
フラグゲット。
- フラグ:
ctf4b{dont_reverse_face_mask}
yakisoba
以下のような問題文と共に、yakisoba.zip というファイルが与えられる。
Would you like to have a yakisoba code? (Hint: You'd better automate your analysis)
ヒントに自動解析とあるので、angr *4 使うのかなーと思う。
目的のアドレスと回避すべきアドレスを 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))
フラグゲット。
- フラグ:
ctf4b{sp4gh3tt1_r1pp3r1n0}
参考文献
- Angr Beginner
https://ox0xo.github.io/ctf/angrbeginner
付録
問題ページの全景
感想
ひとつひとつの問題がそれぞれこう解くんだよと手法へ導いているようで、解いていて楽しかったです。pwn とかも他では見たことない優しい誘導があって、いいなーとなっておりました。 ひさしぶりでしたが CTF ってやっぱいいなーと思いながら解いていました。もっといろいろ解きたかった。。。
更新履歴
- 2020/06/03 新規作成
- 2020/06/04 更新履歴の新規作成日付が誤っていたのを修正(6/2 -> 6/3)。一部文言を修正。
- 2020/08/31 CTF サイトが閉鎖されていたのを反映。CTF 結果が掲載されているページのリンクを追記。
*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